{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Chapter 4 Code - Python 3 version\n",
    "\n",
    "### glmnet2RocksVMines.py"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 1 2.0\n",
      "0 2 1.0\n",
      "1 1 2.0\n",
      "1 2 1.0\n",
      "2 1 2.0\n",
      "2 2 1.0\n",
      "3 1 3.0\n",
      "3 2 1.0\n",
      "4 1 3.0\n",
      "4 2 1.0\n",
      "5 1 4.0\n",
      "5 2 1.0\n",
      "6 1 4.0\n",
      "6 2 1.0\n",
      "7 1 4.0\n",
      "7 2 1.0\n",
      "8 1 4.0\n",
      "8 2 1.0\n",
      "9 1 4.0\n",
      "9 2 1.0\n",
      "10 1 3.0\n",
      "10 2 1.0\n",
      "11 1 3.0\n",
      "11 2 1.0\n",
      "12 1 4.0\n",
      "12 2 1.0\n",
      "13 1 4.0\n",
      "13 2 1.0\n",
      "14 1 4.0\n",
      "14 2 1.0\n",
      "15 1 3.0\n",
      "15 2 1.0\n",
      "16 1 3.0\n",
      "16 2 1.0\n",
      "17 1 4.0\n",
      "17 2 1.0\n",
      "18 1 4.0\n",
      "18 2 1.0\n",
      "19 1 4.0\n",
      "19 2 1.0\n",
      "20 1 3.0\n",
      "20 2 1.0\n",
      "21 1 4.0\n",
      "21 2 1.0\n",
      "22 1 3.0\n",
      "22 2 1.0\n",
      "23 1 4.0\n",
      "23 2 1.0\n",
      "24 1 4.0\n",
      "24 2 1.0\n",
      "25 1 4.0\n",
      "25 2 1.0\n",
      "26 1 4.0\n",
      "26 2 1.0\n",
      "27 1 4.0\n",
      "27 2 1.0\n",
      "28 1 4.0\n",
      "28 2 1.0\n",
      "29 1 5.0\n",
      "29 2 2.0\n",
      "29 3 1.0\n",
      "30 1 4.0\n",
      "30 2 2.0\n",
      "31 1 4.0\n",
      "31 2 2.0\n",
      "32 1 4.0\n",
      "32 2 2.0\n",
      "33 1 4.0\n",
      "33 2 2.0\n",
      "33 3 2.0\n",
      "34 1 4.0\n",
      "34 2 3.0\n",
      "34 3 2.0\n",
      "35 1 4.0\n",
      "35 2 3.0\n",
      "35 3 2.0\n",
      "36 1 4.0\n",
      "36 2 3.0\n",
      "36 3 2.0\n",
      "37 1 6.0\n",
      "37 2 2.0\n",
      "37 3 2.0\n",
      "38 1 6.0\n",
      "38 2 2.0\n",
      "38 3 2.0\n",
      "39 1 5.0\n",
      "39 2 2.0\n",
      "39 3 2.0\n",
      "40 1 5.0\n",
      "40 2 2.0\n",
      "40 3 2.0\n",
      "41 1 5.0\n",
      "41 2 2.0\n",
      "41 3 2.0\n",
      "42 1 5.0\n",
      "42 2 2.0\n",
      "42 3 2.0\n",
      "42 4 1.0\n",
      "43 1 5.0\n",
      "43 2 2.0\n",
      "43 3 2.0\n",
      "43 4 1.0\n",
      "44 1 5.0\n",
      "44 2 3.0\n",
      "44 3 2.0\n",
      "44 4 1.0\n",
      "45 1 5.0\n",
      "45 2 2.0\n",
      "45 3 2.0\n",
      "45 4 1.0\n",
      "46 1 4.0\n",
      "46 2 2.0\n",
      "46 3 2.0\n",
      "46 4 1.0\n",
      "47 1 4.0\n",
      "47 2 2.0\n",
      "47 3 1.0\n",
      "48 1 4.0\n",
      "48 2 2.0\n",
      "48 3 1.0\n",
      "49 1 4.0\n",
      "49 2 2.0\n",
      "49 3 1.0\n",
      "50 1 4.0\n",
      "50 2 1.0\n",
      "51 1 4.0\n",
      "51 2 1.0\n",
      "52 1 4.0\n",
      "52 2 1.0\n",
      "53 1 4.0\n",
      "53 2 1.0\n",
      "54 1 4.0\n",
      "54 2 1.0\n",
      "55 1 3.0\n",
      "55 2 1.0\n",
      "56 1 4.0\n",
      "56 2 1.0\n",
      "57 1 3.0\n",
      "57 2 1.0\n",
      "58 1 4.0\n",
      "58 2 1.0\n",
      "59 1 3.0\n",
      "59 2 1.0\n",
      "60 1 3.0\n",
      "60 2 1.0\n",
      "61 1 3.0\n",
      "61 2 1.0\n",
      "62 1 3.0\n",
      "62 2 1.0\n",
      "63 1 3.0\n",
      "63 2 1.0\n",
      "64 1 2.0\n",
      "64 2 1.0\n",
      "65 1 3.0\n",
      "65 2 1.0\n",
      "66 1 2.0\n",
      "66 2 1.0\n",
      "67 1 3.0\n",
      "67 2 1.0\n",
      "68 1 2.0\n",
      "68 2 1.0\n",
      "69 1 3.0\n",
      "69 2 1.0\n",
      "70 1 3.0\n",
      "70 2 1.0\n",
      "71 1 3.0\n",
      "71 2 1.0\n",
      "72 1 3.0\n",
      "72 2 1.0\n",
      "73 1 3.0\n",
      "73 2 1.0\n",
      "74 1 3.0\n",
      "74 2 1.0\n",
      "75 1 3.0\n",
      "75 2 1.0\n",
      "76 1 3.0\n",
      "76 2 1.0\n",
      "77 1 3.0\n",
      "77 2 1.0\n",
      "78 1 3.0\n",
      "78 2 1.0\n",
      "79 1 2.0\n",
      "79 2 1.0\n",
      "80 1 3.0\n",
      "80 2 1.0\n",
      "81 1 1.0\n",
      "82 1 3.0\n",
      "82 2 1.0\n",
      "83 1 3.0\n",
      "83 2 1.0\n",
      "84 1 1.0\n",
      "85 1 3.0\n",
      "85 2 1.0\n",
      "86 1 1.0\n",
      "87 1 3.0\n",
      "87 2 1.0\n",
      "88 1 1.0\n",
      "89 1 3.0\n",
      "89 2 1.0\n",
      "90 1 1.0\n",
      "91 1 1.0\n",
      "91 2 1.0\n",
      "92 1 1.0\n",
      "93 1 1.0\n",
      "94 1 1.0\n",
      "94 2 1.0\n",
      "95 1 1.0\n",
      "96 1 1.0\n",
      "97 1 1.0\n",
      "98 1 1.0\n",
      "99 1 1.0\n",
      "['V10', 'V48', 'V44', 'V11', 'V35', 'V51', 'V20', 'V3', 'V21', 'V43', 'V50', 'V15', 'V22', 'V27', 'V0', 'V30', 'V53', 'V58', 'V56', 'V6', 'V28', 'V36', 'V39', 'V47', 'V19', 'V7', 'V49', 'V54', 'V2', 'V8', 'V29', 'V38', 'V23', 'V57', 'V13', 'V32', 'V31', 'V42', 'V59', 'V37', 'V45', 'V52', 'V16', 'V25', 'V46', 'V18', 'V33', 'V1', 'V55', 'V4', 'V17', 'V26', 'V12', 'V5', 'V40', 'V34', 'V24', 'V41', 'V9', 'V14']\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYQAAAEKCAYAAAASByJ7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzs3XmUXOdd4P3vc7e6dWtfeu+WWpK1\ny7IsW7YTZ19IiBMwAyRkmxAIEGaFlzlnBgYYmDnwcl6G8A7LHJY3CYSQwEAIIQs4DgmOncSbFluy\nZO3qfanu2qvufp/3j9uWvMi2rEiW7dyPzj3Vqqquem519/O7z/Z7hJSSRCKRSCSUa12ARCKRSLw0\nJAEhkUgkEkASEBKJRCKxJgkIiUQikQCSgJBIJBKJNUlASCQSiQSQBIREIpFIrEkCQiKRSCSAJCAk\nEolEYo12rQvwQlSrVTk5OXmti5FIJBIvK/v371+RUg483/NeVgFhcnKShx9++FoXI5FIJF5WhBBT\nl/K8pMsokUgkEkASEBKJRCKxJgkIiUQikQCSgJBIJBKJNUlASCQSiQSQBIREIpFIrEkCQiKRSCSA\nl9k6hEQikfhe4UeS07bD412Hx3sO7x+tMGEaV/U9k4CQSCQS11AkJbOOx+M958LRtTnVd/HW9rxX\nBdxcyCQBIZFIJF4ppJQc6znc2+isVfwOJ/oOvTA6/5yxlM62TJo3VvJsz5hsz6a5zkqRUq5+D38S\nEBKJROIqavoBx3sO9za6fGG5wcm+C0BV19iWMfmx4TLbsibbMmm2ZkzymnrNypoEhEQikbhCztku\nDzR7PN6zz3f/LLg+AAK4rZjhI+MDvL1aYCilX9vCXkQSEBKJROIySSmZc32+utLic0sN9rf7AKQU\nwRbL5PZilm0Zk23ZNLuzaQZfgkHgyZKAkEgkEi9A0w/43aklvtPscqrv0l/r/9+RMfmVTaO8tZJn\nYzqFpohrXNIXLgkIiUQicQmklHxuqcGvnZqn7ge8ppTlfSNlNlsmtxQybM+mr3URv2tJQEgkEoln\n8UCzyyOdPqf6LofafR7t2tyYs/jsDRu5Pmdd6+JdcUlASCQSiaeZtl1++eQcX11tA1DSVDZZKX5r\nyzgfHK2gipdfd9ClSAJCIpH4nhetDQ6f6bvc3+zyRzPLCCH41U2jvGe4TMX43qgqvzfOMpFIJC7C\niyL+ZKbG700v0Q4uLA67Y6DAf79ujLGrvDL4WUkJzWmYexhm98e3d/wODF9/Vd82CQiJROJ7jh9J\n7m10+NVTc5zqu7ylkuf7Knk2WSk2W+aLPz20X4e5AzB/AOb2x0evFj+mmTCyB3z7qhcjCQiJROJ7\nwj31Dp+Yq3Gq5zLluAQSJtMGn969kbdU8i9eQXwHZu6H+UMwfzA+mlNrDwoY2ArXvRXG9sL4zTC0\nC9QXJ0AlASGRSLyineo7/Pqpee5ebTOa0tmbt3jnYJGtGZN3VAuY6ou0C8DiYTjwKXj0/4DTjO8r\nrofRPXDzT8QBYGQPmC9icHqaJCAkEolXpKYf8Lvnlvj4XA1TUfiVTaN8ZLx69ZPEhQGsnoLlx2Dx\nCCwdiW8786AasP0HYPd74qt/q/ycL+X7bRxnDseZpVDYi2FUrmrRk4CQSCReUZp+wOeXm/z22QUa\nfsj7Rsr8l40jDBhXsduluwxHvwCPfR5mH4LQi+9XNKhugcnXwMQtsOuHnxIEgqCDbc/gOLPYzhyO\nPYvtzJ4PAkHQOf/cG3b/f1Srb7x650ASEBKJxMucE0Z8Ym6FLy43OWe7NIIQgFcXs/z360bZdTUW\nkK2ehnP3xt1AC4/Eg8AygoFtcOvPxP3+QzvjYKClAHC9FRqNb9GYvp9O5zC2PUMQtJ/ysqpIYSol\n0tKiGAxjOkOYPZt0u421UYHqlT+VJ0sCQiKReFmKpOQLy01+48w8s47PzXmLdw0W2ZBOcX0uze3F\nLOJKLyBzWvCN34QH/yQOAKl8PBX0tb8AO/8VbmmQXvc4jjOH3fsqzuonsZ0ZbHsWz1sGQMWg4OfI\nuxrpnoXZ7pDutEk7EVogEczF76WmIDcMuREobACjcGXP5SKSgJBIJF5WekHI3y41+MTcCsd7Druy\naX73hnW8tpy7Om8YuFA7DjMPwD3/D/RqRPs+jHPjv8JJqTjePO3GfhonP0rfmzv/bUJCKtQwXaj0\nPDJdm1LTJ9sNUPJjkB+F3FYYH75Q8eeGIDca/z9dghd5RXQSEBKJxMtCOwj5g6kl/mx+hXYQsTub\n5g+3r+OHhkooV6PiPPW1uDUwfwhk3A3lTtzAzKtuZc79R4LH/+H8U9UgotgOGG365DoBaZkhpVdR\nMoOQHYT8EKybgJEb4hZFunTly3sFJAEhkUi8pHlRxKfmV/nYuUXqfsgPDBb5qfEBbs5bV75LCOLW\nwFd/GXnyq9RHBulfvwvHgL7msKrNId1ZBhqSajSKqVUwjUHM7GaUnTviMYTiuvPjBi83SUBIJBIv\nSVJKvlRr8Ztn5jlre7ymmOVXrxtl95UeJG6cg/v/OF4gVnucwGuwMJJhZl8ZOx0BcyihJOXBmD/I\nxMRPYL3ug6C//NNdP10SEBKJxEvOA80uv356ngPtPlszJp/evZE3l3NXtkXQWUR+6edpLXyNhSEd\nu6jiDKm4ZoVIERSCPJsq76E0cSd6bgNCf3le9b8QSUBIJBIvGSd6Dr9xZp67VtoMGzof2zbBe4bL\n3326aacFj/wV8tBfEvaXcGSHjhkwO2rS3pNHlSoZZZCcXmEgNcLghg9SqN5+ZU7qZSQJCIlE4ppb\ncn3+57lF/nJ+FUtV+MUNI/zUxADWd5NWIvTh5N1w8C9oL3yN2WGD5Q0GoaYAcXePJcps3fTvGB79\nETQtc2VO5mUsCQiJROKa6QYhfzi9zB/N1PBlxIfHqvz85DDVF7r/QOjHi8V6tfiY2094+K9YynSY\nG03HrYBIMFh6E9nqLaTMEUxzjHx+N0K8SLmMXgaSgJBIJF50fiT5i/kVfufcEqt+wA8OFvnFjSNM\npl9gP/3y43Do08hH/go3WMU1FFxDoVXQmb/eJNBzWJ7Olup7Gdnxf6FpV2mtwivENQsIQogJ4FPA\nMBABfyKl/F/XqjyJROLqk1LyxVqL/3tt5tCri1l+ZdMoN+YvceaQ78DUt+D01+H01/Eax1gYtpi7\nPoNtXMgRJCLJQD/D+NjPUtzxUcTVTmj3CnEtWwgB8AtSygNCiBywXwhxt5Ty6DUsUyKRuErub3b5\n9VPzHOz02fZCZg5JGW8cc/Av4fDf4sgOK9U0K+uq1LdWkUJSbLlMtEdIZzeRKmzGHHoV+qa3vegr\nfa84pw3Lx+LMqVvfEa9gvoquWUCQUi4AC2tfd4QQx4AxIAkIicQryLGuzW+dXeCulTYjKZ3f3TbB\nuy9l5lC/Do/+NRz4FMHqMZaHMszvHaSlx1lLTafDxKzDqPUqMrf/Coze+CKczVUS+nHK7KXHYPko\nLB2Ng0Bz+sJzMgOw/V1XtRgviTEEIcQkcCPwwLUtSSKRuFKmbJffPrvI55YaZFWFX9o4wkfGn2fm\nUBTFWUQP/Dny2BdpZSLmN46xvG2YEB/LbrNptkfVzpHZ/B7E2z8AQztevJO6EuwGTN//pIr/GKyc\ngMiPHxcqVDfD2M2w90O4le08Hk2wcXIbV3sE5JoHBCFEFvgc8HNSyvZFHv9p4KcB1q1b9yKXLpFI\nvFAzjsfvTS3x2YVVNCH4N+sG+bfrBinrz1Hd9Fbg4KfhwJ/jds+xMFZg4VWj9JUuqnQZWnYZneuQ\nH3gN4rX/Fja9CdRrXn1dGimhPR8HuiN/F49/PFH5F9bB4HbY8n0wuIOgspWT0SiHFmwemWly6ECT\nk8tdwmiGT/z4EG/aNnRViyqklFf1DZ7zzYXQgS8Bd0kpP/Z8z7/55pvlww8/fPULlkgkXrAp2+UP\nppf57MIqCoL3jVb4j+sHGUkZF/8GKeMB4oc/SXTsC9RKgoXJYVYtG5AUggKjZxYYrLlo2++E2/9j\nnBzupayzCHMH4iv+lRNxXqTacfDWNrrJj8POO2HbHTC0i0XX4OB0g4MzTQ5NN3l0ronjRwAULZ3d\n40X2jBfYPV5k34YyhfTlbfIjhNgvpbz5+Z53LWcZCeDjwLFLCQaJROKl6VjX5venl/nCcgMVwQdH\nq/z7dYOMms8SCJw2PPrXyIf+lI59ioWxPIuvHiAQHinFYLKRZuT4SazQhpt+HN7zUSitf1HP6ZLZ\nTVg5CWf/BY7/Y7xRzhOyw3HXz573wsBWGLmRcGQPdx1d5sv3LXBg+iEWWg4AhqqwcyzPe29Zx56J\nInsmiqwrX6Xkfc/hWra5bgc+CBwWQhxau++XpJRfuYZlSiQSl+hQu8//O7XIP620sVSFnxof4KMT\ngwynnuUqdvlxeOhPcY/+FYvFkIWNBXqpEoowGFA2MnJ6mvL0KUR+HF77a7D3X78000QvPBLvizB9\nP/RXLtw/dhO86Vdgw+vindLSxfMPNfseXzg0z8c/802m632G8in2TZbZu67EjeuK7BjNk9LUa3Ay\nT3UtZxndB7zM54QlEt9bgkjyL40OH5+t8Y16h4Km8guTQ/zk+MDFxwiiEE7cRfjA/2al8wALw2nq\ne9NIIclbm9naMhk6dD+6fR+M3wI/8mvxJvTqVdz/+HKEAdQeh/s+Bkc+B2YxnvFT3QyV62B0L+RH\nzj99seXwwPE5Hjxb5+FzDY4vxV1GN64r8kvv2MZbdwyjKi+96u9lMiqTSCSupZM9h7+YX+Xvlhqs\n+AFlXeWXNo7w4bEquYtd2Tot5IG/oPnYH7FoNVgeMQkm8qT0AdalbmTk9BSZ4/eCosPOH4LbPhpf\nYb+UzB+Eb/0eLD4ap8iOAtAteO1/glf/+6e0AABats8f3XOarxxeYGq1D0AupbF3fYl33TDCazYP\nsGeieJE3eulIAkIikXhWB9t9/mB6ia/UWuhC8NZqnh8dKvOmSg7jIqt/5eppOg/9FksrX2W5LHA2\nqagiz0D5TQy305QPfBXR+Ey8XeQb/yvs/VC8beRLRRTC4mG493/CsS/GXVYbXhe3BsqbYPP3PaO8\nfhjx2Qen+d27T9C0fd64dZAP3rae2zZW2D6Sv6SWgJQS2e8TNpsEjSZhs0nYaDzptkHpAx8gtXHj\n1TpzIAkIiUTiaRZcj39YbvKF5SYH2n0KmsrPrR/iJ8arDBjP7MqRUUjr5KepnfhTlpVZnLSKGNEp\nZ29kU/GNDJx4DPVbn4PAhnWvhjf/t5dOt5CUcOYb8NDH4y6hxlQ8JTSVhzf8Etz2s2DmL/qtp2td\nPn9gjs8fnGOuaXPbxjK/fMcOdo0VnvTykrDdJmw08BeX8M6dwzt7Fn9+/kKFv3ZI3794GYVAzefJ\nveUtVz0gXNNppy9UMu00kbg6pJT8S73DH8/UuKfRQQLXZ9P88FCJ949WntEtFIZ96iv3snL6z1np\nPoynhYhIUhbjDE5+kAG3iP7Qp+DsN0EzYfe74ZafjvcTfilw2vGg8Dd/G2YfjFssE7dAeWPcEth2\nB1gXciO5Qci3T61yZK7FieUuxxfbnFjqYsiAN05keP+oYFd/AefYMfzZOcJ6nWCtwicInvLWIpVC\nHxtDLZdQi8X4KBSICgWCXI4gkyFIp/FTKXzDwFMUXM9j586dlEqXN8j+kp92mkgkrr1l1+fLKy3+\nbG6F4z2HIUPjFyaH+aGhIpssE4iDRb8/Rat1gHbnMJ3WITqdI0SEqEFEpWcwMPQDVLf9LNrjd8EX\nfy9OuZAfi1sDN/34UyrXa8J34NCn4dBnoX4G7Hp8f34c7vgduPGDT9kHWUrJfNPm8VML3Lf/JA8f\nnUXpdtjQWuDm3hzvq0+T7zVRggtX9UuAWiphbNiAun4d7NkD+TxeLotvWdipFN1UinYQ0Ol0cBwH\nx3FwXRe330f2es95CgMDA5cdEC5VEhASie8x3SDkb5Ya/P1SgwdbPSSwK5vm97ev4wcHixA06fYO\nMrN6nHb7URrNB3DdRQAUqZBre4x3fCrKBop7/xNKfh3s/yR8/XUXuoXe+j9g2zuv/WpitwMPfxK+\n8wfQXYoXtu34QShviGcHXfcWokDiHjvB7Ll5Dh2b48zpObJTp7hu5Rzrusu8G3j3k15Sjo/hvuYW\neoMDeIaBr+v0TJOOrtPo9eh0Oti2HT+5142PNUIICoUChUKBYrGIaZqkUqmL3qJBI2xQ82oseUvk\nxy7edXUlJQEhkfgecarv8MnZFf56sU43jNhmpfjFcYXXZVYo+qdo1x7hwdOHzlf+AIZeoRgUKU0J\nirU6GVFG7HwP7PkBaJyFb/1+vBhLt+JuoX0fgZHd1/As19hNePBP4P7/DXYDueH1+Pt+FbtdJGy1\nsM82mD9zH9GxPyYzcwY1CgHYBWxTVVYHhli9cRcHJsbQC1kCVcGVkpbn0+ysZdix7fgAVFWlVCpR\nLpdZv3496XQay7KecpvJZMjn86hq3P0WRAFL/SXmOnPMdeeY7c4y25lldim+rTv1p5zSuuwoI9kR\nrqYkICQSr2BBJLl7tcWnZuc51zjKJnGW/2LOcZ1xFpwzhDN9VoFVwDQnKBZuJpfbRbYXkD3zCMaj\nX0R4x2HTm+GOD8UDrifvhr96H7gtqG6Ft/8W3PDeZ0zDfFEtHYVTdyMbU7B6BmYfRPg9HDZSP7OF\n9t9NEXm/gWOa56/qW5kc5wbHae7YRZhLo+oKkogwDM+/rJA+ludimiamaTI+MsKNAwMMDg6Sz+fP\n359Op1GeY88FKSUznRnuPnU3Dy4+yJHaEZb6iwTywntpocaIV2asl+f2zjiV5kbyTYVsU5Bx0+wc\nzsCmq/opJgEhkXglkVLieTWm6ke4f/EgS63HGIjO8GHmUIlAgubnyGV3kin/KBlrE5a1gWx2C4Yb\nxFfVd30MOvPxVf+2O2B4d5yY7W8/DDKMp2Jue0e8knjdq67JngNhs4l78iTBI1/CmPl7THEuvt9T\n6HVNGt0c07XN1FKDLA+OUHv7PgJT52J1dqlUYnBwkEwmc76CL5fLDA4OUi6X0bRLryYXugscr51g\nZmma+dostUaNerdN07NRfJOsW6bSK/P6zjsx/TR6lEaVaaSSRirPTPXhmVAfhjqwwxi4zE/r0iWz\njBKJl6kw7NPtnqDbO063+zid7nGaneOIsHn+OV2lipXZzmR5N/ncdvK5nZjmxIUcOVLCwiF48E/h\n0f8TL77a9Ma4f91pw8mvxgOwuVHY/aOw9Q4YvxmUFyfNgowivKkp3GPHcI4dwz56jO7yCfxSH2/Y\npG3lqYVlluUQHSVDIMQzApSDjpIuMDA4wPbJUcYHSuev6qvVKpqm4/YCwiAiCiPCQOL2fPodD7vj\nE/oRUSSJwgi3H2B3fTorbbrtFq7v4vk+jh8S+jpGaKHK5w4gKeFgmZJUWiVlGaRyKcyihVnKYubT\nGGmNlKXFt0/6Wk+pl53bKJlllEi8gkRRQN8+S6fzGK3WAVqtA3S7x4l3n4VQmMwywRl5Mw11km3V\n3dwxcTMb88+y6GvpMTj8N/DY5+NVuJoJY3vB657fnhKzEHcV7Xl/HCSuchCQnod7+jTO0WP0jh6l\ndvo0K7UazVSKdiFPr5qlPT6EPzH+pG+S9IVJP0rj+yYpw6BiWVSyGcqpAkU1g+KDZ3u4NZ/GbMBq\nVENGIh5M7h/Hsy+9jEKE+EqXltHB01wiESFFRGQ4pJU+ZRlRNlKU0mmK2RypYgazWsCsFsmMDVIY\nqmCYGYR4aW7pmbQQEomXIM+r02w9RLPxYFz5944TRS4Aqpolm7+BOWUbX7dH+EZ/hFUGeVO1yPtH\nKry5kke/2OrYMIDjX4EH/him7gOhxFsySgmdhfg5I3vi2UGb3gSjey47CIR+hNPzcfsBbt/HtQN8\nJ8RzAjwnxGv3cRZr2LVV2q0Vul6HvnRxzAg3FeEbwVMynamhgRpYqEEGNUijhmnU0EQJTcRzpERT\n9D6q0UXRbRTdQdFchAhBRAglRE110VJdVKODUAOEEiKUEC3oopztcrJls6z5tAxJLSc5NhGgh5Lb\nmhE70hE5MyRvSbJFyUV6fJ69XIqBEDpCqAihIYSGsnYrFBUpNYIgheeZ+J6B6xrs2/cRxsZedVk/\nj6SFkEi8TESRR7tzmFbzYdqdI3Q6R7DteOtERTHJ529gfOwDZLPbkekt/HWjyJ/O1an7IVssk5+5\nrsyPDJUYerYso71V+M4fwoE/g/7qhUpeRuD2YGIf3PrRC9MxL0JGErvrY3c9nE7cndJvefSaLr22\ni9PxLzzeCwjc8KnfjyRSXAK9R6B1CbX+2q0NhfNPQl/7l5UaOd+n5HrkI48o3aZfiLAzIaigGZBK\nKWiGimnppCwTw0yhqAIhBKomSOdSGCkLVcuiqRU0LYeixgFEygiQKEqKaKGJc+9BgqVVeq06M50F\n7kqd5Z6d4BoCPVKoRCZVkeMj1Zt53xv+A9XMyPnuGykjwtAmCNoEQZsw7BNGDlHoEEUuUeQRRS5h\n5OA6XRqNPu22i+0EOE6E60Q4jsRxwHYlXTekHwQESkigBPjCJ1ACSmNzjI19l79szyMJCInEiyyK\nfDqdwzQaD9Bo3E+ztZ8oivstTHOcXG4XoyPvpljcRz6/GyF07m/1+MOFOv9wskk/rPHmcp5/t36Q\n2wqZZ/Yrh37cJXT0C/FRPwOs9QRoJmx8Y9wCmHwNDGwDRSHwQlo1m9ahGp26Q7/t0W979BoO7VWH\nTt0hCp7Zm6BoAitvYOUMzLQgr4do6RZhe5FOd5GO16CTUWjn0wRPGpxNp/oUs3Usq4GVaZKxmlhG\nj9KiYN1CkwG3Tz+l81B1NyfHv5/q5M3smdzIuuoYinJ51ZaUkmBhgWC1Tths4E1Pc/Kf/55/VB7j\n29sVakMCb603Spcqbxt8PR+45WfYUdnxnH33QihoWoaO7XF2YYHF5iKtXou23aZtt+m4Hbpul6bT\npOk1cTUXV3EJlZBABITqWsWf8QmywbO+z/vK772s834hki6jROIqC0ObdvsRms2HaDYfptU+QBjG\n2TAzmS2USrdRKt1GsbAPw7iworcbhPzlwiqfmF1hyvHIqArvGijy0xMD7Mim4ydJCc2peC3A7H6Y\nfSjO0hk9KS9OYYJw2520ht5Jk0laKx6tWp9O3aXfdum1POy295QyK4ognTfIFAxylTT5ikm2nCKd\nMzAzOobTRJk7jTx9jP6xYyzOz7GoSlbGKtSLVfpaFgBBhJVpksutksnWyWbbWPkMfTnETLvKsVqB\naNXlTc4R7uAhssJm2dpMfeeHGL79AxSL393KXCkl7rFjtP/pLmb+5Ssc0OaoZ6GZFcxW4dENClLA\nLZW9bB3exUB6gAFrgFePvpqSWcINXTpeBzuw6ft9zjTP8PD0wxxePkzDbeBFHq50cXEJxLNX5k/Q\nhU5RL1IyS2RTWXJGDku3sEiTDlKkAwPTNUjbGqm+jtlRMdoKlp9i53tfR2Xb5TURLrXLKAkIicQV\n5PtNer1TdHsn6HQeo91+hF7vBFKGgCCb2UKhuC8OAsVbMIzKM15jynb59Pwqfz6/QjuIuK2Q4f2j\nFd4xUCAjRJyO+ew9cO4+mH34QhoGoRKh0vKrrGo3sFp+B6vqThrLPq2ajYwu/K2bGZ1cxcQqGGTy\nBtmySWEwTWHAIl8xMTM6QhFEjoNz9Bj2o4/EM31On6E1N8vyYJraRJXVUpWWWiEi7oYyjB75/Ar5\nQpNS2UDLVah7o5xuVnl4tsCRpQyRVEnj8BPFQ/yo+Gcm7ceI1BTsuBNl30/GOYW+i6ms0vNwT52i\n/U93UfvaV/i2Oce9uxQe2SiI1l42JXSGzAHeuun7ec3Ya+j63fMVf8/vcbJxksO1w0x1ppA8tY4U\nUpD38uTJk1JTmKpJPpVnIFtlqFBlIFcmn86QS1ukVZO0ZpBWdSxFR2t4+ItNvJUWYc8l7DqEfTf+\n/RARISG+cPHMAD8VEaQCfC0gUHx27f4gE1v2XtZnkgSEROIqk1Ji21M0mw/SaDxAs/kgjjt//nFN\ny5PP30A+v5tCfg+Fwk3oeuGir7XiBfzdUp3PLzU52OmjAO8YKPBvqjp7Gwfjq/75g/F+vU48rbSX\nv4lVZTv1Zop6y2Q1mGQ1nCSM4i4VIaA4ZFEayVAatigNx7f5ahoz88zxhrDbxT70CM7Ro7gnTuCe\nPEl7+RyL1xVZHh2gmRugIwv4YWrt9SOy2Tr5oouZT+GmKszYwxxernB4wcJfq32FgPVli52jed6c\nm+bV7X9iaPpLCK8b7yy290Ow532Xle8obLXo3nMPna/9M/aRw4TNJr3Q5syQ4Ju7FR7YrmJrEWWj\nyObyVnJGDlWoBDKg5bY40ThB22s/43UtmabimwySIisEpqZh6Srj2RSbSwqm0SGKemvjAx5R5Jwf\n9L8SpITIUwhclcBRCR2Vddt+nptu+/BlvV4yqJxIXGFhaNPtHqPdPkyz9TDN5sN43jIAul6hVLqV\n8fy/JpPZTMbajGmOPu+88YPtPp+Yq/GFpSaelOwyQn5Zn+PO+n2MH/4a1E8D4FCgnn0tK9bPsahu\nZmFepbt4IRlbOuVTmSywa32FymiW6niW0rCFZlx8llBQr+McO4Z78iTuqVPYhw/Tbp9maXOZ1cEy\n7WqFTmUjffcGQCBEhGV2sKwevuZRCzM82hzkbH0PXi0uh6EpTFYsNlaz/NTmDBuqGbYO59hitjAf\n/zs49Bk4eQK0dLzR/N4PwbrbXlBrwF9cpP/Qw9iPPorz6KM0jh9h/4aIb+5Ncfr9gp4aEIq4WlOF\niqVZCL9L3WvywOID5DSTtKKjC4GBYKuAYdNgIu2S0wJSSoSphlhq/6Lvr6oZ0qlxUtooSpBBRCoy\nUPA6EXbLx7YjPCnxJfgywhcRHuDJEM8LiWyIbIn0JKpUUaVAkQIRSggiIi8gdD0Cx0VG0VPee/f1\n2y75c7pcSUBIJJ6F48yv9fs/RLO1n17vFE/M+0+lhuN+/+I+SsVbsKxNl7xoqOcHfH56ir9YqPOI\nr5OJXN6/8g0+NPVZtvXP4UQZ6spODqR/lEV9G8vNIr3OhZZ8Rq0zoh9leDKkuu92yvteRzpvPuv7\nySjCPXkK+8B++gcP0T10gI6V3IO0AAAgAElEQVQ6T319geZAgXa+RPM16+j2bgDi+fFaZBPqPl3d\nYcYvc6y3nvZKjqF8irFimrGSxZs3pJkoW0yULCarFqOFNMoT0117q/D4F+Huv4GpbwESJm6Dd/1e\nvEPas+wx8Iyyex79g4fo3ftNOt/8JrOLJ9l/neDIJo2pN2rUvl8ghQo8s/8+pwrW6TajaY8JI2Tc\niCg8qaKXUhD4OTRtmFx+I+l0EcOw0DWLlDlE2pzANMfQtBxSqjhdn+mHpzjz4Anmlk5iB10C6RNG\nDiIKEaGPCANEGKICChIRhRCGRIEP5yt4iaGEpFWfrCkoZBSylkomLzB1SUoNSCkehnQwpI0RdjHC\nLk2xekmf2XfjBXUZiXg1RVZK+cw21osg6TJKXE2Os0CjcT+N5gM0Gw9gO/HUT1XNUizsJZ+/gVxu\nF7ncTlKp4UsLAF4fVk8il47xQG2Rv3Hy/H16Oz01zc7mGX7s3Le5qRvQVbdRd8eodyzs/oXXLQyk\nGaraVPz9VBpfpaKcJrPlRsQb/nPc1/4kYSRZ7bos1pqs7n8E/9BB9KOHKdSOYk9Klier1IqDtGSV\nXr/IE5W/UAIiw6enpemnxohy26kWCwzmzLUAYDFeSjNSNJ97I/j2Ajz+JTj2D3DuW3Gai8p1cP27\n4fofgcrzJ+KRUuKdPUfn29/i5P67OdI9yInhgMdGFBYsQfCUj1ySUWC9EbLdjBjSI0wBhqKQUVLo\nfoF2K4Xt5JBRlYGBHYyP30ChMIBlFchmi+Ry+fPv6/s+juPQ7/eZnZ7l1P7DLJx9HNftEUYBIgpR\n7R70+/RUC1cxCIVKJBQCoUHKQrFymKZGVvfJqh4Z1cESNln6FGkyHC0yGs2Rk92Lnn8gFZpkacgc\nDbI0ZXw0yDJ560/wtne95Xk/w4u5YmMIQojPAB8FQmA/8azhj0kpf/uySvZdSAJC4kqRUuI4c7Ra\n+2k2H6Le+A62fQ4ATStSKu6jWLqVUvEWstltCPE8C7S8XpxgrXYMVk5A7QRy5ThHXZUvF9/KveYb\nCLwSw22P7a0epa6K17vQQNdTKuXRDOWRDMVhi/JQiqHe10kf/F/xTl5mEbn7PdS3vYdj4XoeX2xz\nutZlqeXgLy5SOHeCsbmTbFs9y7rULN0tJksTg6xkh2i7VRwnB4Cihlh5yFcHGBzewuj4dkYHB6hm\nU5j6C1yEJmV8ro9/OT7m1v42q1viHdF2/ECcB+k5AmcQdGhMPcSxI1/hyPIhTgZLnEuFzKgK7vkF\nZxIQqEgmTIM9hQFeNbCJdakxOh2VhYWAs2e7dLs6Uio8saJtdHSULVu2sHnzZkZG4nUD/X4f27Zx\nHIdut8vps1MceewEc3M1/CgilBBFAjtU6GLS1bL4QiMUKqFQ6Rs5uopJkR5DosGwqDMi6mwS82wX\nU2xXpimJi1f2K7LANGPMRmMshYO0wwK9KEdfZulHBZwohyctdKlgGSqWqZE1dXKZ+HjzWydZt+Hy\nEgheyYBwSEq5RwjxfuAm4D8D+6WUL3qO2yQgJC5XHABmaTS+Q73xHZqNB3C9JSBuAZSKt1AqvYpS\n6ba1APAsqQWkhF4t3nd38TDh/BHsuXP0Vlr0wiLdsMIZfRvn9B20/CrZjsD0L/yNqbpCcciiPJI5\nf1TGs+QrJkIRsHIS98BnUQ79JXp/kUXzOj5n3snn3VuY7kR4fshob4Wblo9zS/0Mm1tnSQ22qW0u\nUhsZoGEO0O5V8TwLAMMIGR7OMLlhE1s272NkZOJ8+uXL0q/HM5vO3gPH//H8GAeje+NEeNveCYMX\n+rqljHDdJWx7Ctuepts7x5nFQzxeP8sZr81UKJn1FDwZV+IKEg3BE5NgK6ksrx+9hbesfzvbc/s4\ne/osZ8+eZWZmhk6nA0A+n2f9xusoDY2jm2k0IwV6msW2y+PTS5xbajK/2qbedemHKiEKIQqBUHGV\nJ8ZhJHn6VEWLKi2qosWwaDFpdhnR2lRkg5JsUpYNckEThacuvAtEilVlA0v+elb6Q/TDIm5YxIsK\nOFERJ8ojFZ181aQ0FA/sp3MGZlbHzOiks3r89dqhqlc2tcWVDAiPAXuAzwB/IKW8RwjxiJTyhitT\n1EuXBITEC2HbcQBoNO+n2bgwA8gwBigVb6VQvJli4Say2a1PaQGEfhSvxG30sGfPYs9PYS8v0290\n6XcC+r5FPypgh0Uc+cy+8FCBdlpBFnSGRrPsXF9gYjRHcdgiV4orfscPObfa49Ryl6m5RSpn/56b\nVr/M5vAUkRTcF+3i48HbmXbX82rRYktvibH6LJXF00T5FRa3V1keGaVBmW63TLQ2s8iyIkZHi2zc\nuIPrrtvLwMDAZSdEA8C34+mtJ+6Kt8NcOR7frxrx5vNbvx+5+W24pkq/fw7bnqJvn8PuT9Hrn2W+\nM8OUGzDlKcysHc5a5a9JSSXSUFWThuJjRx4CwZ7BPbxu/HXcPvJavHqKA0dP89iZGebrXWx0Ij2D\nks4Raml6gaDWC2i70dMKLsliUxQ9KrLJeLTMCCsMyQYl0aWs9CgqPSpKn5JmkxFdVHmRPY2FApkB\nyA4hc8PYssxSLcX8vE7bK9OLKnTDMrYskR/MURnLUhhMY+UM0jmddNbAXLtN53RU7YVX9FJKCENQ\nFMRzpNh+LlcyIPwH4lbBI8AdwDrg01LK115Wyb4LSUBIPBffb8UtgPp91BvfOp/+QdfLlIq3Uizd\nSrn0KkxzI72GS2OpT3OxT2u5T6fh0ql16NZtXPfif3Sa4mGZPlZGwSpZmNUyS6bB/aHL/sjDTqvc\nOFbgLRMl3jpQoKCqzDdtzq70nnHMNHpczxl+TP06d6rfxhIuy8EQ8/Zm+o1B0rUW5uwUgd6judVi\ndV2JVrVCU5RotQeIIg1FiSiXFcbGRtiwYTcbNuygULj4tNZL1lmEmQfi6a3zB2DmIQhsfDNNf8ON\nuEMbcEsDOKaG7c7Flb89TRS59EKY9hRmPI3pvsa0D+21WKRGknVdnQG1TJjJM6eozHZcZJDHZIhh\ncwt5dRwRFqk1HZY7Lt21llUGhwI9CiI+hkSLYeoMUqdCi5JsU5AdcqJPRrhkFBdL8VDFxes2qaSR\nqTJYFURpCJEdhEwVMoOQHVwLAIPUuxmOP+LRWnHptz26DZfOSh9TC7luV4aRiTSmCWYKTDVA9DuE\nrTZRr4f0PaTnEXke0o2/Dh0bt9+n6zjYQYAXyXhGEhJPxK0iTyh4ioKnKniqiq9peLqOr+vccfM+\nbvyhOy/rx3pV1yEIITQp5fMvy7vCkoDwyhVGkqW2w1zTZq5hM9vox183HTqOjxdEuEFEJqUxXkwz\nWjSZKKVZX1imIL6N3/8W7fYjQBR3AZVuo5C7DS26kX59mOaSTWOxR2OhT3O5T+hfuKI0NJ+cukyO\nObLKKhm9i1XJkx4eIT02ibV+G+bYRgwrzl625Pp8ZmGVT8+vMuf6DOoab8tl2eErrK7anK51OV3r\ncm61jxdceJ+RyOaNyizvlPdyvbafnN4gCgXtqTSNUxb9hk5n0qK9c4jGSJEVLUezW8L341XJQkgK\nBcG6dSNs334rmzbtwDBeQEa1pwvceAxg6Shy5n7c2W/Sc6aw0yquqeEUytjZNH3NxY+e2i8eSo0l\nt8hcR+VM1+NM6LGUiusSIWGgpzPsl8iICkZQQHVMFDfCiDRMKbFwsYQT3+KQEw55xSYne2TpkxM2\nWWwsHJRnqdgjCU6o44kUkZpFiiyhtAhDi9DPoDOEppVRByuoowMopSJRpCMjBen7SNclbDYJG3Xc\nWh2/axP0XYK+Q3+pSdTtoAU2KiGKDFBkSCADOrkc7UIe10gRqiqRquBrOr4RV9yBphGoGpGqEKoq\ngaYTaCqBrhM91xW+lIhIxt2SUsY3CCIEoRDc8vrXcef3vfmyftRXbB2CEGII+E1gVEr5/UKIHcCr\ngI9fVskS33OiSLLSc5lr2Mw3HWYbfWYbNnNNm6W2Q63jstrzCKOn/uFXMgZjpTSFtE4qo2BoCm3b\no9U6SMZ7iMnoEQJnmVVgvrmeRv0deI3dKI2NmLaCtEPirUXqICBfTlHKO0xMnKVo76fkHqSozpNO\ng9hwe5zbZ/3bYWjXM/YCdqOIv51f5c9nVtjft4mAcj+iOtOlNdXhb9aKrgq4Ph1wOy0+HK0w3l6g\ntHKOkv8YhYEVMsMuQoFOI8MReRszI9dRu9mkfoNCu5c63/VDBywrYN26HJOTW9iw4UaGhsbQNQ0C\nJ+7KcVah58V7GIQ+hG68mXywdvj9uNIPHPD6yNYMQf04fvccgVMjCG0iBSJFECkCISWqApYdku2F\nqKs1lFBhJRIcU1VOaArndJWzusY5QycQ8RTOQQKuDzx+rOexy3XZ6XrkLnahqYAUIENBFEIUKnih\ngRuo+P6TD0Hd11n2UwSBQhgogIGipTFSWTTVRIQawpGIXoC0XQh9ZBQgRAR0kFED6Z6Iu1qegwSc\ndJpmYQBPNwl0DV8z6E9UcSob6WXTeIpCKCBA4F+k900CoVDwVRVP0/FUHV/VCFQVX1UJVQ1UDanr\nCDON1HVQlHj9s5REUUTkuwRem8Cr4fk1wrBJqHQIlR6+2sNX++wwtz7nuVwJl9Jl9I/AJ4H/KqW8\nQQihAQellNdf9dI9TdJCeGmKIkmt6zLb6DO12me63membjPftJlv2Sy0nKdcKQMU0jpjxTTDBZOB\nbIqBXIqRoslYMc14Kc1oMY1lxJWj57WZm7qH2tI36Lr3IkUdGanYq9toT++hO7eHwIlnX7gaNETE\nChENVSKVNtebR3mL9R32hgcwpEuopvHX3U5q8xsRG14bB4CnpXmu9zwem29x/2yTr3S6nEhLQk0B\nOyA/t8rE8jKvkSvcEC2w3l2mbNewuiso7VUIbBRNYuQDUoUQzQrxhRZf76oWPgpRKFGQPDHEqash\nuiLQVAVN1dAUFSXyIfAg9OIpnFEQZyi9AkIBUhFEUkFGCkFk0AoMTkU606gsIlhRFFZU8AAjiI+8\no5F34yPnGGRdHTOMIPRRwgAlCtDCEFMqpCIVI1RQvQjpegg/QIkur/xSVRGGiVANQEcoBmgplFQK\ntZRFq+ZQ82mEpoGmohgGIpPFy2ZoGykaCOZWbVa6Dn4Y4UcRQRTiaR5SvXjQ6JsWK+ksrm4QKgqh\notJJpcmXK+wYG2ZDuYSp6xiqSk7XyKkKeq9DWF8h7LQIWk2CVh2nUaffbNBYWmCqPc1KwaGZ9emb\nIf10iG1JeikfX3nqZ6OiUNHLDKUHGcmO8OHdP8muocurdq/kGMJDUsp9QoiDUsob1+47JKXcc1kl\n+y4kAeHqiSJJ1wvoOAFdJ6Dj+HTcgJ4b/7/rxo91nIC249Ps+zT7Hitdl/mmgxde+GUWAoZyJmOl\nNCMFk9FiOl7MVEwzVoqPvPnM1AlSSuyOz8pch9r8YZrte/HFA2jZEwglJPTS9JZ24Df2YYhXUaxW\nyQ+kKVTT5KtpCgNpDFNFLj5K79EvwvGvkK0/BsCyOsy/yL18ybmeB6LtuBikdZWNFZNdhT6jokHW\nq6H2lvC7dUTYJp/1KBh9CkGHQbfJoNfEinoo4vkrNQmEqPhouKTw0QhRCREIVaIYKoaZxrQKmNYA\nipYGRYsDk1DjWzWu9FDj6ZSRLwkdSehGuL0efreF160T9Or4vTae6+N6ksBTCT2FyFeRngBPQfgK\nwhcovkT1A7QwQItC1O8ydY2ngqcLXF3g6QqBUEBogIqQgji9nSQUcSskFIJAVXBSCt20pGmF1DMh\njQy0MuBoGq6m46kaliyx29/Kzf4WbvDHCYlYVno8oq1wSukxIxw8AXlVJy8UUqwtBpMSTYYYoY3y\npD2LkQIhUyA0pBJfua/ks5wq5mhZWTxNJ1BUAkVFz2a5tVrk1cUsoymDlCJIKQpbMiZGq87U4UN0\nVlfwbJug79BZrrG0OEsLm8BUCAxBqEGgC6KUSmAIXC1EItClii4N8mqZrFrBokCKHIa0UKMUSmRA\noBIFAt8PCf2I0A/ZdecW9t0y/iw/ied2JVNX9IQQFdby5wohbgNal1WqxIvK8cPz3TErHZfljstS\n22G541DreKz2XFa7Hs2+R8cNuJS6IZvSyJkaRcugZOnsGivwtl3DjBfTjJcsJsrxIqYnz2mXkcRz\nQ9y1DVNa5zos9wKcnk+34dCp23TbC7jhAYziYayho+jpFhRAsSfR3B+mWHgtwxtupfyGAob5tF/b\nfh3OfBUOxDt9ic48WQRM3Ao3/jeYuJVMINg3e4rrV6ZwV7+M2pqh4Mww3FjCaD5zOKyjWrT8HD3H\nJOpKHBvOumWkHEZNlzBKw5hDE1jj67G909SmHmehBTOMsMggci3Zm2m2KVdcRkaKTK7fwuTkrWQy\n1yE7PYKVFYKVVbr1VYLVOkF9FWe1Tn91GW91lbDZQLQ6qL0emnuRGTBPI4BIM/FUA1c1sDUDV9Vx\nDXBTAUHOxU/ZuKaHp0t8DXxVIUDDU3RcTcPRBb4eEugege4TaAJPA08V+KqCq2r4qopPinKvyFgn\nQ7WrkO9FmLaLElwoZ6hpuGmNviXoWhFeNUVqvEKxVEFBA19CIEn5EYNuRNWLMHs6Vi+F6eqIUODg\nc1SZ4lHzzFPOtQAUJCAhiiIc1SEQ0Vo3jIIMTXRnkLRXIJIa04U6h8eXmS034pXNUgGpIr0+dLuY\nNYuUp5GO4pZNuW+R11doC/CjCE3Gs6JWgoBqFFFWU4wyisaTWpZPn3AWrB0vYEc2gBBJSEgoBKEC\nUlFB1zAuc4bRC3EpLYS9wO8Du4AjwADwI1LKR6966Z7m5dRC8IKIei++gl7tedTXKt9G36Pei6+u\ne15IGEUEoSSMJJGUhBKQEkURqEKgCMET28QKxPk1PvGA0xMDT/GgbBBJ/CCiZfvUex62/8ymsBBQ\nycRdNNWsQTljULIM8mmdvKmRN3WypkbGUEmrKhlVwVy7OkqJeNvBwAsJvAjfDfHdEM8O8JwAp9/F\ncWfx/AWCsEYYOIShTRQ5CCVAKP7arlRrh+phZFcwcssomhOXT+bJpG9haPgNjIy9iVTqIltAhn6c\n7vn01+HU1+KvAalZUJwEq4QXRPjNOVL2AvrTphO2MJhXMiyTpS8yyDBF4FjcPXI739h6Ox1hMX5s\nmsJUh66eZVW16EkFkFh4DCg9NinLbFKXkWgEQgcpMd0+vgtdR0e6Es2NyDo2ebtD0WmtHR3yTh89\neubPJkLQ0006xv/P3pvFWpKk932/iMj97OfuW61dVb3M9PTsPcPhULPRFE3RNEzKXCQDFixaD/T2\nZAN+M+BdBmTA9oNg0LAEkZQgwhQJ2QJIarjOjKZn6em9a6+7b+ee/eQaEX7IU/fe6q6q6a6ubo7E\n/gNxIzNvLpF5Mr9/xBffEjF0I/p+hYFXlrEbkHouqSfIfUmuyslGLy2ojjVRnuOYlKzSY9jsszc7\nYn8modvIMHdllpFYE2CtW740MkOo+NQ7JRD5HK5ZJhJL1NUSC3aWtbEhGuzhDA9g1MPGI0gmIATW\ncTGOi6zUcGoNrB+SWsiMBSnxfR/XdUuhnSSYH6Iy8q2Db10CPyCsRlRn61RaNcIwxPgBfaU4pKCj\nczomZrCT4N+EM1sRUXbSUTDCsNM6pD+3jaodMp+5tOOAZhrhWgfHSHzr0S4azOZNAus/sE0aQy4K\nclHQUyN2vQ575AysJLUOuXGIjc9YR4yMR4Yix1JQevNqLIYy6EkUubTrPovNkJl6wGzDZ6ERsNSK\nmKn7tKo+lcB5b6bC98FjtTKazhtcoeyEvGnt/Qx233/8KBFCnGle3OhxuzM+niTdH6QcjFIOhin9\n+P6PSElBK/JoV1wiz8GRAnWqCFEmBDT2hCSsPSGA0/ByqCaGSmLwjcAx4FiOh7eeknhS4CmJKwSu\nlDgCsKALU5Z8Whf2nm3GFChvgvLGSG+M8sYod4Lyx/du84e4YQ8n7KG8+wcEA8A6IFwEHkJ6KOmh\nlEeg5giKNt6kRjSYx+/VMKNxWcYjzLCP6XcQyT6y6OLIIa4f44QaN9K4FY0T3CtkdCbIRg75SJGP\nFfnYKetJuZ5aSeZA7MPEk4wqbTrNMxzVm4z8Q6y3idOOUFELlYXIoUL1wR0o3InGTxOiNKaaTojS\nmEoaU0smOPfR72sh6flVen6VI79Gz68xDEPGFZ8kcogrirgqiKuWJNIoZ0KlGNFIxrR7ExYOEha2\nU5Y6Ce1TOQsmnuDlS1WunQm5vSDZaWZ0ghFmqs6SeASyjsRF24TY9rkbh0miWAjXWK2eZyVcYZE2\nraFC7U3o7e4zHvTJkwStNQh5LPSt44LjYpWDlaU66H4QQhCGIbVajUqlQhiGx0ntA8/HjQWyU6D2\ncuRBhmddfD+ACy265+rcXg3YVrCVZGwmOVtpxp04I9Gai0cFz23nXOpozgw0NQuhEoQVh8iV0xhC\n4OQGld37e1hpKZwCTYGxmtxkdCf79EyPnhowcVIK15L4mp3mgDe8IzaykNiEWF3BFhVscoYiXobT\nIwORI5w+0jtEeh2k20OoCUKNp/UE4YxBJmBcrPWntQNWld+GdXCkgytdXOniOy6+8gldj9DxiTyP\nX33ul3l+7ZkHf2MPweOcQ/gP7rfdWvsPHqll7wF/kYSQa8OLGz3+9Noh37rR4fsbXXJdPjslBUuN\ngMV6MO15lz3wmarHTOWkJz5T8akFzkkAsHeBcT9l/86QgzsD9teHHNwZMjmd1ESU4Q9cX6EciVQa\n5U9QbozyJ0hnMs0re3o5RqoJwilfWuQE5BjkEMRDhDsgZQ1HNXCdJq6/gFVzJHaGg0mLjX6D652Q\nzZ5l6zDFPThieXzE8uiQlfFBWY8OmYt7SCwIi+Mb3MpUwFc0qmZwqxq/UuCFBVKevKfWQqp9BkXA\nYeZwUGiOjKCjHQ6sS4xP1Ya0c0VzWFA9GFEZWQpTYRLUyGszxEFETyh0lhFkKVGeEOQpUZ5SzWNq\n2QTP3N+yOlEufb/K0A2Z+D4T3ycJXLLAQUdgQouONHlVU9Q0jpfiuzEVb8ic6dLOEqpDQ30Xwp5E\nD0LiUYAZKNSwQJ6ytupXqlxbXeK1szVuLSp2Whm9qItmFzEV8AgfKX2wBmPGgEVYga8DGiwzl83R\nSqpUEo8wlTiZmQZaE1gpsdIBpR4cYkIqiCJstQZ+iHYcJtrQLwqGhSF1XWS1RtieI5qdwfX8skds\nQRWahcOM1f2U83sp5w8zfF32nN9sKb41o/iTGYfXGhIjBEFhWYkNq7HhiQQupYKzQ818v6CaGd7q\nY20BVXNRzQARKay0WGHIdUp/fMDB4W22t67SG++R6DHSUahaBRs5ZA2H/TXBK0JzayAwRQWrI6yu\nYuOz6Gz2nmtFnuKppTrPX2jz7FrEcktQDSSOMsQ6ZpgNGWZDkiIhMxmZLkthijKRjk4ZpmMOxwO6\nyZikSInzcnum8+NS2JzC5GhbYGyBFRohCv7OM/8Nv/bZv/rQ7/JBeJxzCJ8+tRwAXwG+B3zghPBB\nY7ef8PU39/n6G/t880aHYVogBXx0pcHf+sJ5nj8/w+XFGgs1H+cxupono5z9O4NpGbJ/p08Sd8re\neDCgvpiz9pmMqJXgVycof4gxffKiR553j/O6PhwSx6niOLWyqBqOM4/j1nGdJo7ToKBKXFQYpBG9\nNKAz9jnow07fsj/I2R9l7I8N/dQyEw84M9rhifhlLqTb/Fy2w0LeoW7GOJ5GeQblGcS8hXMC4YP0\nLa5bEKiMt3JklwrrzLApamyogC1HseUZdoIJO9GYXAiscSkmZ5DxBaJkgXoc0egWzB8dkScDbDYm\n1ykJY7TsMZ90WZxsw9H2PdeKHY+BX2HkRfQrNXaDWfLQxXgW6ee4KsajwCclNClhkhGMh1THQ9yx\nweka5DsdMwsfCLg7YRMDSImamUWcXeTg4ixbZ6qsLzjcCPrcGF/ncHwb1zh4xsPXAUvjkCBdo5oF\nRFlAqAN8G+IaH4V7nKj9vrAGK0slhgEKWZpKjoKIw8YM+605JkFE4nqkrk/quAglEdZijSlDMk/b\nrgDPUfiOi6skvoHzuynLvTHn+5oLvYKz/QJnym/bDYdvn4/Ym/HIai4zmeW5kearXU1jPSca5Ljj\ne0m4AEaFZWwsk7pH7VydmctNCGJ6gz0O9m6zd/s6uz+4xqTfe9vtttfOUHx2lpuVJi+PM9Z7Bl34\npeqsqKGvr4I5URc5CmqB5NlzLT53cY5Pn2ux1o5K0+eHBfZ7AIy1xMZMCVSzm+bsZwWHWc6wMAy0\nZlRoBoVhWGiGWjMoyjIsDLExoA1khkvnfnhwwPeKd+2YJoRoAP/QWvuz70+THowPYoSw3pnwey9t\n889f2uG1nTKo60oz5IuX5/iJy7N87uIsjfAByczfJYwp6B9tsb9xi6O9dQa9LeLJLoYOKujjBAPc\naIh0h1P76rfDcZp4XgvXnRanies2cZz6VLg3ymWndrzNUTUULsmoy42tA27udbl5MOLmUcr2oGAY\npxRZTMVOaIoRTcqyaLqs5Xssm0NmGVATEwKZ46oC5Vik+/B3yUoH3Ar4FTI3ZOIG9LyIPc9nW8It\ncl7TE17TQ4ZWYfImNm9iigYmm8Gkc5C3cfIqjXHB4uiItdE+q8N9VkYHrI4OmZ8coU6p1iaOx2Gl\nTbdaZ1CtkoQhReCSRx4mdFHNDH+2IKoNaFXuUK/uo1SBmxnqo4KenuGa/ywztspHexuc3X0RLy3f\nC2tBZy45i2TFDNk4IhtJ8kFO3p1QHPbusYMXvo9qNLCBz14dbjYM61XLflXRq/qkgY9rfTzt4Ruf\nKA8IiwDHeg+JrWTKkMtFGXZZWIMU4CqF5/tUKhUa7TZzC0usnj/P6oUnCKLo4b+TtRwdHbG+vs61\na9e4du0aeZ4TBAHnzp3j3LlznD93npaJyDZGZOtD8q0R+d74OHUzrsRp+Miqi3AlGIseZuhuis3f\nYl7Z8FDtgMxVdMc52z/WLLkAACAASURBVLsTDnsZY2Npn6syu2rx/D36e9fZv32To61NjC6JQwhJ\ne2WV6oWzHLaqjKVibC27heGNYcHmkSKbLIIpnfuksASeIfIFtVDyqTML/NiFJZ5ba7LYCB4a4M9a\ny0aS8cY44Y1xQicviHUp7Eda08s1vUIz0pqJNsS6JIOHIVKSmpLUHUXNUdSUou4o6o6k5iga0+11\nR/HjrSpL/qM5Ir5vnspCCBd4yVr71CO17D3g/SKEfpzzuz/Y5re/u8mLG2Uv45NnW3zt6QW+/OQ8\nl+ar72qSx5iMNN0nTXenZZ80O2A83GUy3CNND9D2CFQf8RYvTGsdFG08b46oukAQzuF5s2Vx27je\nDJ47g+e1cYyDHHdgfFimUYy7ZUn6EPdgcogZd+iMUvYnlm4Ko0KSaIFGotDUmZQhARjTEkMajHEe\nYlapM4HOJTqVWOthVAhutYxvHzbBb2CciL4u2BeGbZVzR+bcsJp1NHtC05VgzLSXpiuQV3GTGiJr\noIs6ua2j8Vgt9jlnt1i1uyyKA+bdDi3Vp6omCN9gQ4v1QYdgQoH1BdYFo0r1gxESROnhK4QBYZHC\nIOXb78/aUiMujUVYMNJFCIUyBSLPQYO1qtT5agG5xeal7kMUIDRld1Z44EZYr4J2I2LHZWBgUhjS\nAnShQHvIIsAYB20URjto42CMQmuLLQzkBpkZRKpx4xw/y/HThDBN8Ccp0SQhGidEaYZXaDzXw200\nUPUast5AVivISgShhwhdCF0IFAROWXwHGyiEq7CuIEfT6R2x3zvkqNclyTKU8Ii8OkvNFeacBcKs\nih0JbGywsQVhsMKUQwVpyzkuobGiVAPenbMQgUSGClVxUFUHFSmciqCQls5Rwc66ZWcD0lSBkUTB\nAGG2GPWvMRj00Dho6eBXA2R7lk67wUFY51BF7OQBB3FIVjSm5q6nIA21YMRqOOZpf8wTqsucGuBW\n2ojaAiJskU+6dEZ9dnND5jfIgxaZX2c/1+wUsI9PInwKqciFxHBCzK4pcITFFeBLSej6REoRKoOP\nxZfgCUMwrSNpqCtDTRZUpMETBkUBVmNtDibH2hRrThWbYnWGNSlfOf/TnJ/95DuWQ6fxOOcQfo8T\n3pfA08A/sdb+V4/UsnvP/VPA/0r5Sv2f1tr/4WH7P05CsNbyr24d8ZvfXudfvLJLWhieXKzxcx9f\n4WeeXWK19fBeVJ73mUxuMJncOY7kGCebJMkWaboHb5kAttqhSBoUSR2d1lGyTRDMU22s0Jo7w9zy\nWar1ZVynhUiHMNyBwVYZW2awA/1N6G/AcBc9PmQ8icl0OWlprUAKg8LgonEpCEV2/4YDxgoSfArj\nQi4gBWKDSaCIQScSnZVCX6cSnQnyTDG0EQO3wtCNmDg+YzfgsBKx1WqwX6vTDSv0vYChG5ATYHQw\ntWo53aux1LwRs36HVWeXZbXPvDpk1j+i4Q+IwgkqzKFqeZvC+O4ZcoEpXArjkRuPXHuYohSoxiq0\nlaSOh3HBcxJqbo+q08eR91r2CG2IJppWr8AxlrHjMnSryFygBjF2LDCJLJ2SXIV2JTrwsZGP8dxy\nXYIWpZ4XNFIapNT3LY/ZcOTu43z7un3A+vT6RgoK4ZILh4K7xSXHpcClmPpMnNTu8X6lL4Wa+li4\n0+NOjtc4ZKfOc7roty2rt2xT99bi8YzE3w8IaxBYLAL7oNHbY8b/3HqFv/nc33ikYx/nHMLfPbVc\nAHestZuP1KpTEGV4yf8d+BqwCbwghPhda+1r7/XcD0M/zvnt727yj/7VHW4cjKkHDn/9U2v8+59e\n45nl+n1HAnk+oD/4Hv3ed+kPXmQ8vkaWHZy+Gzx3EYpF0uHTjA6eZ3RYp5i00GmbWnOZmeVFVpcd\nZlczZqs9nOywFPZHN+Glr8OfbsJ4H5I+VhfkKAoUAvDI7wnUpZiaPEtIrcORqHNgmxzZGkfUGVJF\nEyILSW0wpnHUo3p4RHUwRqYGkwqslYzckMOwwZFfp1tvcVSbZVBrMlxoMPJr9LyQI+EyMIrYKOwD\nrErKphiqOmZh3OMZvceqt8N8cEiz0qNaGRLWxjj1FFEv4K2jXl3OY8uhwPYd9H5EmofERZWJqTIW\nDYaqQaZDitwve+pA5nmMwpB+GNALK/jRiKXoNk8HL3NeXC17X4AfnqNZ/yKN+rNE4UW86z9AvPhP\nMbtXmRCw5y6wEdTo1CqkSUSWhWRpSGZCMiJM4ZzYk09TQxkMuUhJVMLETUhVuZyqFGOyMlOW0bhW\nUHErLFYXOD+zxlprjsVmjWolQIYOWkCiLZkxpFaXAc+MJjWWxBgm2ZBJUU5AJkVGolNinZIZRW6D\naQnRhOSEpATkeKR4ZLikOKRiWqRDJhTFD8vt8AgQ1uDaoiwmxzUFyhgcrZHaojQ42qCMJjAFymYo\nmyHJkaZAGV3ubwtco3FsjmfzKc1kuDbHFeW6khrpaoRTjvZckeOIvHQYVBarBNYBR+U4MkcpjaMK\nFAUSUwpxBBY5pZ6SmoDj/53QYI7ILeQScnAKg1OU90YBIheQAxOJGbjQd2AosanCZrL03EvBZhKb\nS7QIyJ2Q3A3RcuogJ120VBjlYIU8XrfSwQiJUQ5GKJ747MUy7vT7iB9KCNbaP36frv0Z4Lq19iaA\nEOK3gH8HeF8I4fr+iP/7G7f57e9tMsk0Hz/T5O/+wsf4mWeX7tEbah2TZR3iZIPu0Tc4OvozBsOX\nmdozUImuELmfIzCrJIMFehsN9q4FpJOpI5KvWZ7tcrayxdLca8zyCs5kB2514ea9PVRr327YkeCy\nyyKHts6RrdGxdbrUKGQVgY/QLk4K/jAhHPWJxgc08y4NM2Y+P2SuOGRgIzq2QYcG60GdI/8yR80a\n3ZUavahGJ6hz6DTI5Nv1kYGJaeVDWvGQ9mCf8/mIRj6hlsdU85iomBCaEVE4JKhM8KspTiODtsbM\nWPSMxb5lcCXGIHsSDhT6VoV8FJHEVZKsysTUGcoGo6jKJAxBlDF1pC1DO8C9sWIG1QoHjTqd2Qi3\nFnNFvMbn7cuc5wYSg9YuIj6HGX2RojeD7vp0x0Nu6JhYfpPMeYFYRMT2iyB+AgNordCxRKeKXEGq\nCiayIA0LJvWCsZuQeJpUWTJlyBRYHBwToWwdJSNc6RN4LoHjIBywSlBISYZPhs/38UnxyYxPduRR\ndN9j71eCsBZfg2/BMxbfgK8tvtH4tqBiczxyPDvCJcOzOT45vi1wrcYjx7EW1xp8URBKTeRBEEr8\nyMUPQjyvQhA08cM2wm9SpJCMMga9mKO9Ht2DAf3umOGgYJII4sKjsBG58EmEJREwlgUjVXAkIbUu\n4E/L3RckQ7pdHG9IFCTUwpymXzATWGZcQ9v6BEbgmBxPZPgixpMxjopxnRjHiVFigpQZQulyJGRB\n5CASEGlZSASkUemYJlTpd6E9pPaRVpbxhYTASDmds5GI0n8Noywog1UWKzWFLMDV2FCDU4CfIMIf\nYshhBGRVZFrFySOU9rDaxWh3WpfrVluscTFaYLWcxn5S1BsPHvU/LjxQZSSEGPL2ASlMH7e19wkE\n/24uLMTPAz9lrf2Pput/E/istfbXHnTMo6qMfuX/+T/4ZuMDT9/wlwoWAfZuLaYeo+J4+wcCcfzn\nba07acNdkhFlpMoHWeO8U1iLW+Q4RY6ri2nvsUBpjVMUuEVe/l/nePm9+zk6n+6vcXR5jNJ6GlbC\nEBpJZCURgqqQVLHUhKEtM2ZlTMMZ4oghQgwRDBFiMK0fT7yjd4MCiUaR4dCxdfZtkwPqrIsmt2WV\nTVVh1/Vw/ZiqN2DG7zMXdliOuiwHQ9oOeDrA5CGmCNB5iMkDTDGt8wCdRei0ikkjdBYdb7fawxYe\nxrhAqUJl+t6JqaPn8fLpn06c+FJYITFClfkPHgFKJ3imT+Dt4np9lJognRjpJiiVIpwE5SbIYIIM\nYoSfgqNPijLgGKxbjnK4j4HGZfGfs/al/+SR2veeVUbW2tojXfmd4wFf7lt2EuJXgV8FOHPmzCNd\naPWwy2fFB+5Y/QC8H4rkx4gHRHM8WRBlaIDCBx0gtA/aPyYBg0FbTYFGW1264D8kIJs9dVEBCCuQ\n9mTbg44qc6zcFe53FeVlsdZw7CNqDVC87cUS2KkQLuP6+NoQFJZAQ6WAUINjDI4u1R6O1jjmpPaL\nAq/IcbV+x79o6a9aPiV7XO62Ux+vWzTGGgpj0QYKDSMDg/s8RscBxwlxVITjLuA6oByB6wocF6QU\np+7dvk0owomgFPf8Gne3T0drFqS1pRWTFeXvZATl/LFAllGakELiKEVLurSFy2WryKwkM6V6M2aJ\nCZdIbURmKxQmYKg9hvadaK/BERpHalyh8aTGERpXahyvQIoMKaZKn3fxmU27LaXBwdTwQN23WJTQ\nONKU9an/3Xs9b1reku7SUqod30EoC0s5ErFCY6TGCE37Z7/0zm/qEfHOfgVACDFP6YcAgLV2/T1e\nexNYO7W+Cmy/dSdr7d8H/j6UI4RHudD/+Lf/60c57B3DWktvb4c7L73Ire+/wPorL1FkKVI5rFx5\nijMffY4zH/kYixcvId9L+sJ3gTxJ2L72BndefpHbP/geB7fLWDBeGLH61DMsX3mapScus3DhEv5b\nzBAHSc7V3SFv7g25tjfi6t6Qa/sjDobp8T6eIzk3E3FhJuLZSsgV6bCUGhpHGaYTw7g4FiwGOPIE\nG5Hgek1xqyJZr0g2IsluIPA1tKdepUNP0ncFTmFZjg0fjQ3nJwmNQZ/8aEgxSpFWYa0kFxpQVFSd\nQFfRsX1wPCYBnq9wPIXjSRzvrgOfQEkQSiBdkB5IWXrbSmmnIUNK9ZXAHgucu4JDWINSFqfUOKCU\nReuUJB0Tj/uM+keM+l2Gwy6TyQjD3Yilmopboe61qDlt6nKGmqhQMRIvzyHtY9MDdHyAjY8w6Zii\niIltwUgqJp7DxHNJXEXqSlJHMnbu9npPzTcZgaslrnFwrIuyHgofRYAkQOIjZIAVHka5GOlipFPW\noqy18jDKQ0sPI5133YsWtsA1Ma5IcFWMrybU1B6ejHFVDF5OIhQxAWPTZKgXKIo2lVqV5kxIbTak\nOR/SXqzQmI+ozQT40bsP71BmHjtFj8ZiM41JNDbV9+hwy+0FNtVYU24XgMk1Nin/h7HlizV95NZY\n0KasjcXq8nrWWChMqQrKNTY3Zbm7n5m26+7yW2phygRDipV3db+PgndiZfSzwP8CLAP7wFngdWvt\no/lQn5zXAa5SOrptAS8Av2ytffVBx/woha54GIosY+vN17jz0vdLYXznFnAijNee/ihrzzzL3Lnz\nyPeqsniHGPe6bLz2MhuvvsTGqy/T3dkq/yEEMytrLF16kqVLV1i+dIX26tp929Wf5Fw/GHJ9f8TN\ngzE3DsbcPByxcTQ59toGmKv5PDVf4ZPViKccl5WJpjksEL0UM87vGQcaYOTAYSA5DCS7vmAnEOwH\ngp4r6HuCvisYuIKhIzBCMKstzTynPujS7O4wO9hHFgdMqmMurFziJy5/mZXKWZJhTjLOSePiON5S\nkZvjWEymOAnbYY3FGIvRFqMNRtvSBHT6UWpdfuB3/2d0uf/7AWvv9jgfHB7i/sdZsGOsGUzLcFqP\npstDsPfvngoRIJ0awqlg3QDtuCQSxsqQeYrCd6k352hXW8zVZ1hqLDJfn8X1FMqdkqxbEq2jLDId\nI0YDZH8fvbdHsbtNvr5Btr5Odvs2pAP8Zo7fLPCXAtyWwvc1ojTYZEiLA7PEkVllpM+QZqs4poJC\noAQ4UuAFCt9XhJ7CcwSOFIhp+BcpQFmLzQw2Lcq6MI9XfSnvMkG5LKQot0mBUNN1JRBKTmuB8BTC\nlQhHItSp/U/Xd48Vp5ch+sQC7mz4SE19nGanPwC+DPyBtfbjQogvAb9krf3VR2rZvef+aeDvURrO\n/Lq19r992P7/uhDCWzEZ9Nl49SXWX/4BG6+dCGPXD5g/f5HFi0+wcOESCxeeoLW4/Mh5U98N4tGQ\nvetX2bl+lZ3rb7Jz7U2SUZm03AtDFi9eYvGJK2V98TLV9swDe2SFNmz1ykxh5YhixLX9kjgm2clE\n+nzN5/J8lY+2KjzluZyJDTNjjdvP0MMMm2koHv4+aqCQU1cAAYUUaFESi8CA0WBztE2QvqRWr1Or\n1/ErAdJR4JQfqFCnPra760KUnd/T92mnEaSOzTdP5iMsFms4JhNdGGzZsUMbi7UnJGMtxyRi7JRo\nbBl23BpLliRkcUyaxORJQpYk5HGMyVLEsUrNIqXEUy4uLq5wcEUZ+8Z1PPwoxIk8VODghA5yGiZF\nTDuxOtNkaUE2jkknCUWaUWQ5usgxOgebUyZCLG3j3wpLOblaSIuWFhyJ74dUojqNSosoqOF4Xtne\nUz1fe9w7LoWyzQ02K0oHtUeY7rBT5ZoVZYC/3ECup9tOtbWwYB2JEzm4FRev5uFVXRxPlSNDRxK0\nfZzIRXp3Q3dM1WaeQgYOwlel0J7KSeEqZKBKwf4IIWj+ovA4CeE71tpPTYnh49ZaI4T4trX2M4+r\nse8U/7oSwlsxOuqw8for7Fx7g90b1zi4dZMiLy0I3CBk/tyFUyRxidbi0vtOEtZaujvb7F5/k+1r\nb7Jz9Q0ON25jpp62UaPJ4sVLzJ9/goULT7Bw4SLV1oNJAkpht9WLubZfqp6u7Y+4tlcSxfgUUTQj\nl4tzVS7OVbg4V+VCM+S86zKXGUQvQw9S9CAnH2XcSTNuoNl1Sx13Lbe0MouyltgRFELgm3IuoJEZ\nKoUmKAyeMSgpcKSDQiBMKbQ+sAnvDwjGaqy1x6JRSol0HIR7qmcq4JglprhLTqYwx6MkrQ2mKDBa\nY800Zqe1U58LU6q+7IkIPp7RkaAcB+W6KM9B+i6O7+FEAV4UIP1SAAtXlmW6bPOEfHuD7PZN0mtv\nkF59HWlHBM0JzprCaQxoersokSEExPhs2kWuuk/Snf889XNfoFWp0QwjAuswPMw42hnTnebNTif3\niU0loD4T0Fyo4EcOridxfEV9JqS5ENFciAiqLo4nUY8xPM0HjcdJCH8A/Bzw3wOzlGqjT1trP/84\nGvpu8G8KIbwVuig42tpg7+Z19m7dYO/mNQ5u3zomCS8MmT9/kYXzT7Bw/iLz5y/SWl5539VNeZZy\ncPsWuzeusXfzGns3r3O0tTmdqC1JYu7sedorq7SX12gtLVOfm6fWnsV5SK5fay07/YRr+yNu7I+4\nfjA6VkMdjk7mKaSAtXbE5YUaH1lu8JGVOp8406JV8ejnBb+7c8Q/2T7ihbgMnf0JrfixrqbZz7nl\nWF6qS96oKzJVSr5zI80zvYwLvSEL/Q5O1kVHMDs/z+LCAgtLC8yvLuJXwrsNLUcNx7Os4l4tzv0+\nndM9Y2tP9rtr7XK3Ov2/kwdz77ap6uFYrXBXjSRBSIGxhvGgy/Cow7BzQP9gj97+Lr2tLY62N4nH\ng+NTh6pKy19kJlph6exlVp59mvD8DN5SFVlzf6g+vsg1w07CqJsy6iYMDhO6O2MOt3rc6b/Kgfcm\nI2eDgkOCFKqxQyP2CRPxtonsoFanPjs3LfPU5+ZP6rl5gmoNIQQmSYi/9z3G3/wWoz//M9LXXkdI\nS3QmRF1qohsZkbPPLPsAaCQxATEBPVvjqvs0vTNf5RM/9pNcOb9KOikYdhLyRJNnZdj23t6E7m6Z\nZ/vu9jwpw7q/FVIJqi2/JIr5iLDm4fqluswLHaKaR1BzCSouXujguPKxh7F+VDxOQqgACeVn8CuU\nuSn+kbW28zga+m7wbyoh3A9Gazqb6+zevMbezRvs37zOwZ0TknA8n9m1M8yeOc/c2XPMn7/I/LkL\neMGj6RjfKfIkYf/2TfZv32Dv1g0O129ztL1Fntyrm640W7SWVmgtLZf18iqtpWWaC4so58E2+P04\n5+bBiNudMbcOxtw4HPP6zoBbh2OsLWXjJ860+PJT83zlyQUuL1S5k2T8zl6X39nv8cY4QQKfb1b5\n2VaNn7Aut3eGfKPT4wWd8XKkGLplT282MXy8q/lIN+Vi9wgnOWJf9IllTt2rMBO1mGu2mZ2dY25x\nnqBdwWn4qIaHeEjMmx8VTAZ9Opvr7N+6we7rb7J74xq9o10ABJKGN0fLm6ddW2bpwmWWP/E0weUZ\nnLnwXQkyrQ3Dw4Tu3oTOzpBX9l7hpeGLXDevse9tYO2IauxQiRWNScBsUqORBlQyiRpn2PzenrsX\nhtTnFqjPzdOYX6Axt0hjfoGK6+G8cY3se98l/s53ybdLG5Tw0grepxaJKymGFOyEerLJgt4BoEOT\nN7jIRuMz1J/5GouLCzSrEdVqldnZWeRbRt93M/f19kqiyOKCIitJYtgp77O3H1PchzROQ0qBFzp4\nocILHfzIpdL0qDZ9orqPGyi8wMELyv8fr4cOrq8eKSryg/CeCUEI8b8Bv2Gt/cZja9V7xF8mQrgf\njNblSOLWDfZv3+Rw/TYHd24RD6c9QSFoL60ck8P8dDQRVt9fC2JrLaNuh97ONoPDAwaH+/T39+jt\nbtPd2b4nCqWQkubCIq3lVdrLq8yunWV27Szt1TVc78FJSkZpwWvbA/7s+iH/8o09Xtkq7/lMO+Jr\nTy/wtacX+NTZFtfilN/d7/HP9nvcjFOUgC+2avzsfJO/Otug7ijeHCd8qzPkj3cOeGGc0JmOtFYn\nhs8dFjx/WHC5O6Rvu+zKHjuyy5iUKgENE9GwES23RrvaZKbZpjHbwmmHOG0f1QpwWqUX8o8i4tGQ\n7TdfZ+vVV9l9800ONm+TJCMAPBmyGJ5joXmBxQuXmX/6CcILTbwz9UfWlyfjnPXNHV5cf4XrnRvc\nGd1hO1+nI/cY+l3A4uWSauwwN6mzmLWZy6s0chcv1uTdAUWa3nPOoFKl0moThRF+muFt7+Leuk2Q\n5khrUcbiN5ssfvkz5GuW4uDbrExexaNAIxkTMiFiSIVr8gk6q1/lo5/6ArPtFkEQEEUR0TsIAGi0\nnRKFIZ3kxKOceJiRjnOyRN9jzJDFmmSUM+6ljPspRv9wXaXrl0RxlzC+8AuXWLzQeKTf4XEQwn8G\n/CKwBPxj4DettS8+UmseE/6yE8L9YK1l3D0qSeLWDfZuXWf/1k2GnZPQGrXZOebPXWT+3Hnmzpxn\n9uw5GvMLH5iFUzIe0d3ZortdqjKOtjfpbm/R3dlCFydRK5uLi8ysnmF27exx3Vpeue+IYref8Idv\n7PH7r+3xjesdMm1oRi5ffnKen3x6gS9emuN6lh2Tw0aS4QrBj7eq/Mx8k5+abdB2Hay13I4zvn40\n4F/sHvKtYUKGQBnDR3oFn+tYPtMpODMZM3JjjuSYjeKQXdstg7gBrlU0bYWmjWiaKi1boe01aLYa\nuDMhqh3itAOcdoBqBzhNH+H8aOijrbWMjjpsvvYyt174DndeeZHJuMyQ6wiXGX+ZleYVLnz808x/\n+hL++QYyeu8xhnRu2Nvp8sbGDa7uXedW7xab8Tp7bNMN9sic6YjTQi0LOZsusWbmWDJ1GtbHTQx2\nlBB3e4yOHqCssJYg10TKobW8TG2thckOcPI+TjGiXuxzTm5RdTN2xAKHtBgTMaLCevgMix/5K3z0\nmSeZnZ0lCAIc5/GQvDW2JIukIE+mGQfvZh6Mi5MshPHUCCDW5EnB8z93kbkzj9a5e5wqo7OUxPCL\nlH4Ivwn8lrX26iO17D3gQ0J455gM+hzcvnWs2tm/fbO0broby951aS2t0F5enc4BnBQ3CH7I2R8P\njNb09nbKkc76HTqbd+hsrNPd3S7j7gNSKZqLy8ysrjGzeob20grNpWVaiysE1SpQjh7+9OoBv//a\nHn/4xj79OCd0FV9+cp6/9rElvvrUAi+PE353v8s/P+iznmTHI4d/d6HFT01HDgCpMbzQH/P1zoDf\nPzzialyqBQJd8HQv55NdyUf7micHKaaRkc8ohlHBxmiPw8MDhpPR8f15wmFG1mlnFWZMlTlTp2Er\nSCFQde94NKFa/nGtGn5JGH9BKilrLb3dbXauX2X79ddZ/8GLdA9L1UzNbTMXrLG4eJG1Zz/G/I9d\nwV2uPFY9udGG3v6EWxubvL59lWtHN1gf32bXbtENdhn796Zz96zPqlrjsrPGijtDIFx8HHytqPYt\n5s11+ht3GGUpifdggR66Gl/m+CLHVwV1J0V5kiNvnr5qEcuQ2GnQWH2Cjz33LE8++SStVuux3ff7\njfcl/LUQ4uPArwPP2rsRxj5AfEgI7w15mtDZ3ODgzq2yp761wdHWJv39veOJYoD63DztlTVmVtaY\nWTvDzMoZZlbX8KPKB9LOIs/pbm9yuHGHzub6tGzQ2925p51+pUJ9Zo7a7BzV9gzV9gxho831oso3\n9+GP7ozpjHPOzkT87R+/wM9/chXfkbw8iu8ZOfhS8DNzTX55qc3nm/eGOu9kBd/ojfiz7pA/73a5\nEWssZbylC8OU548knzgquDQZIxcLonMzhO0GHT1g72CfnZ0d9vb2yPMyg46rHOYrMyy4LWZ1ndlJ\nRDiUCHuvUJUV916iqPmoulvWzek8xgdk9dLb3eHGC9/i1re/w87tq2RZ2XtveYucXfgIl7/w4yx9\n6SM4jQer/N4rtDb092LWN3a5uXeHjd4Wu6NdtpIN9tUW3WiXiTd423EKxUqwxsfNCs+/ltF8dRfZ\nG2EHYzSWJPAwT14mX1vFBAF5kZON+nR3Nkni+8cOUgoKL8S4IdL1cH0PP6pQbTRptNrUmk2iSoWo\nViMIIxzHQToujufiBSFuEOIGAY7n4bjeB+Ks+jhHCC7wU5QjhK8Af0ypPvqdx9HQd4MPCeH9QZHn\n9Ha3pySxWQrgrQ26W5vHk9gA1fYMM6tnmFlZOyaM1vIKUb3xgfhOFHlOf2+H7s423d1tBgd7DA4P\nGHYOGR11iAf39h4NgpvROb7X/AR7/jxVE/NvFa/ynNcjqIT4lRpbs8t8q73Cn0VtxkKyJi2/0Az5\n5TOLrDQbb+v9OrM1pwAAIABJREFUjgrN9wcTvtkb8fXOIS+PcoppjPxzo5yP9uDSSHN+lLMox7RW\nIxYvn8W0PXZ6+2xtbbG9vc3Ozk6ZsxioVqusLCyzVJ9j1msyQ40gVhTdBN1NKXopFG8x2Begah6y\n7qGqHqruIasuqu6jatP1mouqeo9VPWWM5nD9Dre/+x3e/JM/ZX+3dLqsu7OcWf0Il77wec5+7dMo\n/4MLXT3upxxujDg6GDJJYyZZzP7ggDf2r3InucVRuM1RtMswOFEtCWtZ7sBXX7R86WWIkvL55oFL\nMlsl/bHnaPx7v8CMFeiDTUadXYaH20xufp98NKCbRQx0SGYUhZFoIx7sJf9DIIREeS6O46I8D8d1\nUa6H43ko18Vxy22f/+t/g8WLlx7xGu99DuFrwC8B/zbwbeC3gN+x1o4fqUWPAR8SwgcLYzSDg4NS\nlbO5QWfjDp2tDTpbG/dM9CnXpdaeJWq2kEoiKB2+lOOWtuiOi5ASISVyWt9d1oVGFzk6yyjyjCJL\nydMUPbV/L23gDdZO0zcKMT2HQghxyrTTYozB6AKdl85WuiiwxiCEpEAyNA45Ag9DVeRIW57baE3u\nuLx54RleeurTbC2dRemCy7de4zO3X+XJdEy9PUNjYYFae5ZKs0W11aY6M4vTbPF6Ifh2f8IfH3V4\nZZAwsCcCeHmieaZveGqgOZ9PuNiUnLtyhsalRTpxj83NTTY2Ntjc3KTb7R4fV61WOXv27HGZqTSx\n4wLdz9D9kiR0L0UPM8ywdOx7qxf4XcjIQVY9VM0t66qLrHmoyEWEDjJ0yhFJ1UVW3Hc1gTw42OfN\nP/oTrv35N9jduYbF4smA5ZUrnP/cpzn7/CdpL6/+hZlf5pmmszmiszVia/OQ253bjPOYZJoDecds\nMPA2Wd1dpz1KaIwKlo5yPnLbYiR88ynJjQsho1bAZKZCeP4CX3CbfGJ7nVp3Fz8+IkoPiYoB2gqO\niirXzDKHpknX1ujbCiMbkRJicXFNgjCmDI8+jejrOQ6u4+BIiSMFSgiULEehZciuMo3mV/7Wf8zK\nlacf6Tk8DkL4OvAbwG9ba48eqRWPGR8Swo8GrDEMO4elymlnm2Gn7KVP+r1SpWMphXORU+Q5Os+P\nhbqZ5uW1plxWSh2ThuP7uL6P4/kox0EqhZQKoUrhL6Q8Fvz2VGrKu44CQsppDCKJdFyU44AQmKJs\nQ1Fobh+OeGN3CNbw5HzEUtUpiShNS+/gJGbTDfnuEx/j1cvPkfoh7e4Bz77+As9cfZEoeXuIY6kc\ngkqFoF6n0mihZ5c4Wlxlo9bkVQQ3CDhyynkZaS0XRoZn+pqzacwTNcNnL6+y9swFkiJlb2+Pvb09\ntra2uHPnDoNBqQZxXZeFhQWWlpY4e/Ys586dozqdQzn+XbTFjDP0oCQIPcwwgww9yk+IY5RjRhk2\ne4CLsKAkiNApySJyyxFHbUoi9VJd5TR9ZM27R9DHgyHX/+BPufXN77C5/TpxUXq+B1GN1aefYeXJ\np1m+8hTz55/AcX80kt9MBhl7t/ocrA/JEk2RaZI4Y+vaC9Rf+f+4tP4m/imz2L2Ww+88b/njj0Dh\nnNz7YlHwySTls6nlQmZYLFLmipjTY7MxPt/lCt8prnDVnqVDCy0cIlFQcwoimRNQ4JgMcR+5/Eu/\n9EtcuXLlke7zfUuh+ReJDwnhQzwO7PRj/svffpk/uXrAX7kyx//0888yX7t3Il0XOZ1el3+2c8Q/\n7sa8ogWOtXxseMDHb7/GmVuvkw8HZHF8nN/3YRgHFXbnV9hZOMPh0gW2ZxYZT/PjusZycag5Ox6z\nbCdcqrl89uIq51YXiAvN5uYmOzs77O7usrOzQ5aVarzZ2VlWV1dZWVlhZWWFhYUF1DvUR5tMYyY5\nZlJg4gIzzjHjKXHc3XZ3+yhDD/NpMLcTCE/hzIe4cxHOQoQ7H+EuVlBNHz3J2fnDl7j9599lv3OL\nw2yTUVaaHyvXZeHCJZYvP8nyladYvvQkleaP3gRtMs7Zv9kl2dxG7+5SbNzG/svfw929ycSvsrF4\nhn41ol8N2GlX2JlRJG5MoVKMW6BUTksOmbND5syI83mf5+IeZ0+pYXvCY0PUWafNHTvPHbPMbX2G\n7WKVgajgYwhFTihyfvrLq/ynX/nJR7qXDwnhQ3yIh8Bayz/45h3+u//3dSJP8fd+8eP8xOW5B+7/\n+ijmt3aO+Kd7XTp5wZLv8stLbX5laYZ5CfFoQDIcMu73GHePGBwe0NvbYbC/x7BzQDwYkJ1y3rNA\nv9Zif+EM/YUr7M+vstFqMPROBPr8JOdMp8PM/i0ah7dY7B9SzxMcx8UqhxxItaawAqschOfRbLeZ\nmV9gYXmF5bUztOfmCapVgmqtHDE96vMyFjPJy9HHIEN3E4qDmPxgQrE/QfdPhJzwFe5iBXexJApy\nS3KjR+/1DTrpNr1qh06+w8H2rWOz4+bCEkuXn2T58lMsX36S2TNnPzCz6HcDay3jb3yDw1//v0hf\nex3TPaU8ac6gLz1HtnKZpLpIHM0zVnXSiSYZ54z7GTo3hGqfGf9Vas4OdbVHy9mnpQ5pcoQ8Fdwp\nEw77TpttNcOmmmH5x/8Ozz//1x6p3R8Swof4EO8A1/eH/NpvfJ8394b8F1+9zK996YmHeojmxvL7\nnT7/cLvDHx0NEcBPztb5D1fm+GKr+lBduS5yJv0+k0GfLJ6QTibk8YSiyMkmE8aDAXdGI+6kDntu\nm73qPDeaVbaiE8VDLclYOdhhduc6S3vrLB5sEWTJO7pXxw+oNJpEjQZRo0lQrRFUqgSVKmG9QaXV\nptpqEzWahPX6Qx0F3wqTFOR7E/Ld8UnZmWCTk9GTrLoIV6KHGRQWMeMQXyg4knvs3rzK9tXXGffK\neRQ3CFl64nI5grj8FEuXrhBUqg+6/F8YTByTb24S/+AHjL/xTcbf+hb/f3t3Hh9nVS9+/HNmXzKZ\nZJLJvjVNd2hLWQoFZF+UTZRFZVdAQMSrV1GvXPXqvd7rhvpzQRBZlUURRBBFEGQthe47bZql2TOZ\nycxk9uU5vz9mmqalhTSdZLKc9+uVV2aeWZ7vk6ed75znnPM9ad/eJCEsFkz19ZgaGjDPm4f+qOVE\nXQ2EAwnikRTxSJJYJEU8kiIRiqIPd2GKdmCJd2BLd+KgB6ehB6e+l4HTHqL81PPGFGcuRxl9X0r5\n1Q/aNhFUQlDGQzSR5j+e2sRT67o4fX4ZP750CcX2g9di2qM9Gud33V5+3+PFl0wz22rmiqoSPlZe\nTEWORtl4BnrZuH4rO/vj9MTMdBvtbCky0FKw99tzUTxEVWyQ+uAglb3dFDZvwxgYMVlLp0PTGZB6\nPUKnw2g0YdDrEOkUqViMVCJ+gD2DwWzGVliEo6SEguISClwubM5irNm+EkepG0dJKWbbgeciSClJ\nBxOkhpNENmH0hfetcirAUG7DckQJyXINz2A73Tu307NjO5721ky/lBCU1tRRNW8BFbPnZka71dS9\nZy2PfJNSkurvJ9HaRqKtlURbO4m2NhKtrSR27wYp0ZeUYF++HNOsWZjq6zDV1WGsr0dfVPSev2M6\nqRGLJIkPxSlwmTHZxja0N5cJYa2Uctl+2zZKKRePKbLDoBKCMl6klPxu1W6+88wWSuxm7rxsCSua\nSkf12rim8Uy/n/u7BlgTjCCAk4oLuLTCxfnuImw5nC+gxVMMbOmkbVM7zX5Bi8XMuw4d2woFnfa9\nl4ScxJgnEhyRSFLT14lt+yYCHa3Do8MkII1mNJMZYbXhKC2jor4Bd1k5dpOBRDhMdChI2D9IaNBL\nyOclNOh7TxkJyHybL8i2LuzFLmyFTqyFTqyOQsw2GyarLTv+3oLBbMZgMKEPCzRfmuQOP/FdgcwI\nqT10AmNNAeZaB5Qb8SV76evZRfeObXTv2E4iurdj31lWnrnMNG8h7vpZmK2Zcf7WwsJxr+t1qFI+\nH+HXXyf0yqtE160j2dPDyLGqOocDU10dpvo6jLV1w7dN9fXoS0sPa6RWLkYZ3QzcAjQCu0Y85ADe\nkFJeOeboxkglBGW8be4KcNtj62gdCHPTKbP54plzMR3COP5dkRh/6hvkyb5B2qIJHHodF5cXc2VV\nCYsduf02K6UkPRgn3h7A19zDwG4/7Skj25x6NjkFG4rAa8l8o9Sj0WTRWGG1sSA6RNnuZoK7djDY\n00XYO4DMdoxrBiOa1Y7FVUpxdR118xcy54gjqaioQK/Xk4zFiAQDhP0+hrwD2XkgHsKDg4QGfYT9\nPqLBAInoKNaJJJNMrI5CnA43tYZ5lKdqMEkLaVJEUyHQJBZDAaZCG6a6Qoy1duIFMQJJL76+Tvpa\nm+l+d++lpmFC4K6tp2reQqrnZ34KS8ty+vc/XFoiQbKzk0RbO8mO3STad5NobyfR0UGyqwtGjKQT\nNhs1P/sZBSefNKZ95SIhOIFiMmWvvzbioaF8DUNVCUGZCJFEiu8+u41H397NoqpCfnL5UuaWH1oN\nGSklK/1hHunx8qzHT0yTLHXYuLq6hI+WFee01TCSFkkSbw8y1OwhuLOfoF+wucjAumJY5UrT5rCh\nCR0CSZUxxWKHjeVFJcxJhLHv2Ezr+tV429uIB/Z+wGpGM9LhpKhuFpVNc6mdM5fKyircbvd7KoXu\nkUokiIYyo7AS0QiJaDQzxyQWIxmPD/ehxCNhYkNBIsEAkUAm0TjiRcx2LKHK1oRO6BmIddIR20Eg\n6cEibdgNTiyGAgoKXRTWVOCe10i6RGNI85NMxknGogQHPHTv2EbPzu3DyclR6qZyznysBQ5MVitm\newHljU1UzZmHyTrJLj0lkyS7ukh0dJBo302yYzfFn/oUpvr6Mb1fTjuVhRB6oJwRazDnYE3lQ6YS\ngjKRnt/Sy388uYmheIqvnD2PT580C/0Yqn4Gkin+2DfIQ11edkRiFBp0XFbh4qqqUubZx7dulBZL\nEW8NEG72EtzRT9qrsbnIwDvFktXFSVocZkKmzKUVEymWFOg5213BEpuZKn8//Vs20rx2Nd7WZrTs\ncEmp05O22sBZgnvuQhrmzae6upqamhrs9sMvb5JOpQj7fQQ7+oltGEDfJjHGDKRJ05topWVwA/3R\ndlJy72Umu8GJ3eDEoM/M8DVb7bjrGihfMAdjlQNPVxtd27fQ37qLeCRMIhYlnS0nIoSO0to6bEXF\nGM0WzDYbJbX1VM2ZT3lj0/uu7TFV5LIP4Vbg20Afe7uCpOpDUGaCgVCcrz+5iRe29nFktZNvX7iI\no+vHNmZeSslbgTAPd3t5tt9PQkqOd9q5prqUj7idmCeg/IcWSRJvCRDZNUiobQDRn8Sn17G+WM+/\n3EneLtHjs+z5UJdUGxOcUeLkorJKGoIDeFuaad+6ma7tWwgPZBemMVtJOYpIOYpxlFdSU1NDVVUV\n1dXVVFZWYjYfXo0jKSWJjiEia/uJrPdkRi7pBKLcSLw4Qb/WSV9HM0MDA6QS8UzrJDZEIrX3spXD\nWoK7vJ7SxllYiwsxOWzorEaQkoCnj75dO4lFwiRjMWKhoeEKqjq9HqujEKPFgtFixVVZTeWc+VTN\nnU+huwyTxYrBbJ40C+EcTC4TQjOwPB8L4uxPJQQlH6SUPLOxh+/9dRu9wRgfO6qar31k/nsmsx2K\ngUSKx3q8PNztpT2WoMRo4PIKFx+vKGah3TJhHzAyLUl5IsRbA4S2e4i3BAgIHVsLdawv0nizJM1O\npwMpdBhI0WiKs7yogA+X13JkMkb7mlXsfHsl3Tu2gZQY7A7SRSWETHY0S2ahHbfbTXV1NVVVVVRV\nVVFWVoZxjDOVZUoj3hYgvtNPbOcgye4wCDA3OrEsLMnUd8oWBozEg/Ss2ULvlnfp392Kz99FOBV4\nz3uaTTbcNQ3YioowOeyYC+wUlJSiEzpCfh+x0BDJWIx4JMzA7vZ9SssDIAQWmx1roROb04nZXpDp\nRDebMZotmWRitmCyZvpLrA4nloKCfWbmG81mDEbTuNUEy2VCeBk4S2ZW384rlRCUfArHU/zy5Wbu\nfa0Vs1HH1z+8gE8cW3tYK1tpUvKKb4gHuwd4wRskLWGOzcwl5S6uqCqh9H1KNo8HmdZI9kZIdA2R\n6Bgi3OIl7E/xTomB10rTrC2WdNntSKHDKGMstcX4ZFUt5xYU07FmFTveep2OLZuQUsNRVoFj1hwS\njmJ6fYNEs9fydTodbrebiooKysvLh3/2L8UxGilvlMi6fsLr+kl7952PYawpwHZUGbYlbvQFJrR4\nmmi7j5g3SMIfJtw/SF/zTvp7WvHH+0loMVIySVKLkc5+3BlNZmxFxZiyo5f2rACo0+uzJVrSpBJx\nYqEQkWCAaMBPLBImFY9lS6HESMZjw+XcP4jBZM4kij1JYkTSOOnyq6homnvIfyPIbUL4LTAP+Csw\nPOZMSnnnmCI7DCohKJNBiyfEfzy1ibdafBxTX8z/ffxImsoOf1W6gUSKZz1+nuobZFUgjEUnuLTC\nxY01buaMc1/D+0n5YsR2DhLf5Sfa4SccTPGOy8CLFTpeKdMTNRgwaHFmGQY4z+3kE656BjdsYPvr\nr2RaDkJQd8QSZh17AqbyavoHBujt7aW3t5dQaO/6EXa7nbKyMtxu9/Bvt9v9gauXQXYFs1C2/EY4\nSbIrRGR9f6YFoQNzYxHWI0uxLih5zxrSWiJNsitEOhAnHUyQ9EUY2N5Gf+cufPFe4ukoKRKkRJJA\n3EM8uW89K73BgMlmz377d2C22TGYLRhNpuEPeEO2XpfOaEQnxHD9rZF1vbR0ilQiQTIeJxWPk4zH\nhos9puJxTrv2Rirn5LmWkRDiWwfaLqX8rzFFdhhUQlAmCyklT6zp5H+e20YknuYLZ87hsx9qxJCj\n0UM7wjHu6fDwxz4fcU2y3GnnsgoXF5QVDS/mky/pcJJEe5DYzkEG3/Xwjk7ycrmBl8v0BEx69FqK\nsnQny4vSfNxWinVrB9tefYmgpx+z3c78E09l8RnnUNbQSCgUor+/n76+Pvr7++nv78fj8QzXa4JM\noigtLR3+KSkpoaioiKKiIkwf0OGb7AsTWe8hummA1EC2T0Ev0FkN6B0mLPNd2I4qw1j23qSTDidJ\ntAUzZciDmSqz8bYAwYF+fPFuoloYzaiRNqRJGpIkRZy4FiWZjpNKJUinkiTjmVFVB5v8tz+90Yhx\nTyvBbNnbWrBYOPHyK6lsmiTF7YQQ9nyWvgaVEJTJxzMU59t/2cJfN/VwRHUh37v4SBbXFOXu/RNJ\nHuvx8YdeHzsjcaw6wScqS7ilroxay+QY/ZLyRok1+xnaMcAqzxCvuAy8XGag16pDSElZtI/ZJg+n\naxo127poW/0O6WSSiqa5LD7jXOav+NA+q/RpmkYwGMTj8Qz/DAwM4PF4iMX2vSxkt9txuVwUFxfj\ndDoxmUyYTCasVivFxcW4XK7hFkayN0K82Y8WzhTwSw1EibcGQIKxwo7BbUVnz5QAtzQVYao/8FrS\nKV+MeEuAlDc63KpIDURJ+9/7oS9MOnQ2I8KmJ23TSBdoJKxJUqYkmi5NWpcmmUqQTmZaBplWQWLv\nEN1EtrWQiHPa1TdMihbCCcBvgQIpZZ0QYgnwWSnlLWOK7DCohKBMVn/b1MN/Pr2ZgVCCsxaW88Uz\n57KwqjBn7y+lZP1QlIe6B3iidxANycVlxXy6ppSjHLZJM8pFapJkT5jYrkHe2T3AS4kEr5UY2FGY\nadWURSLMi/ZzVNCDe9Nagt0dmG12Fp5yOkvO+ggl1bUHf28pCYfDDA4O4vf7GRwcHP7x+XwMDQ1x\noM8zs9lMSUnJcOKwWCyYTCYsFgtOYwG2Lg1tVxhtKDFcARYJ+iIztiVujJX2TKKwGTGW2w664JAW\nT2cL/cVJR5Jo4Wy12EjmUlbKH8+0UtL7VY016tAVZNeqsBszCx05sgseFexdw0JfbEFnGlvrMJcJ\nYRVwCfAXKeVR2W2bpZRHjCmyw6ASgjKZDcWS3P9GG795rYWhWIrzF1fy1XPnU+vK7aSn7liCX3d4\neLjbS1TTmG+38KlKF5dUuHAZJ7YT+oNITZLsi9C6y8vTvb28poN1TiMpnaAooXG0N8yy/n7q3t1M\nKNSBY04lSz78EWYffdwhVzuVUpJKpUgkEkQiEXw+3/CP1+vF5/Ph9/sP+FqDwYDFYsFsNmM1mGmk\ngqpQIXafHjHyI9Kix3ZkKbalZZjrCw95NTqZ1kh5Y6R8sWyfR6a0uBZOkg4l0ELJzJoV4cS+9Z6A\nkmsXYZ3vOqT97ZHThCClXC6EWDciIWyQUi4ZU2SHQSUEZSoIRJPc+1oLv3mtBU3C9SfN4pbTmigw\n5/bDeiiV5s/9gzzS7WPdUASzTnCBu4irq0o41nnggnOTgd8f5cntLfzN62eNyULEoMecliz3pjil\nL8mSrl70SR+OeZXUnXo0jkY3wpibfhNN00gmkyQSCWKx2D4tjXg8vs92n8+HPi2wSTMWjNikmbp0\nKQ2aG2N2jm5ap5EySFI20IoN6MutmXUhiiwYnBbMNgtGoxGTyYTRaBz1OZGazKxHEdqzqFESc6MT\nvWNslwlzmRCeAO4EfgEcD9wGHCOl/MSYIjsMKiEoU0lPIMoP//4uT67rosxh5o7zF3LB4spx+aDe\nGorycLeXP/b6CKU1FtgtXFtdyiXlxdjz3An9fpKa5Pm+Ln7f0syaiImgwYaQkqW+JGf0a5zan6I8\npqFzmbA2FGOsKsBYacfotr5nxbZc0zSNQCBANBolkUgQj8cJBAIMenzodsfQhzT0CdAnBbaEiWLN\nNpwo9oiRJCxiREScoIgStMYJF6TQHHpMZtM+yWLPz8j7I29XVFSMasTVgeQyIZQCPwPOBATwD+AL\n+ZiophKCMhWt7/Dzn3/ezKauACc2lfCdi45gtnt8avuHU2me6vfzQNcAm0NRCvSZMhnXVZfmdejq\naEgpedPbz71tW3k9KBkSmcsjjV4/J/eE+cighdmRvd+QhUmPodyGqcqOsboAY5kNYTagM+sz60hb\nJu7ymZSSaDRKcLeXuCdEKpBAhpLIoSRENHQRDWNIoktnElhKpxHVJ4jok4SJESZGUEYJamHCIk5Y\nxEiK9D77uOKKK5gzZ86Y4lML5CjKJJLWJI+saucHz79LPKlx6+lN3HTK7EOqpHoopJSsCUa4v2uA\nZ7JlMk4qKuC6mlLOKXFiOIzJdBNl7aCHX7ds5NXBFH59OQDl3j6O7OvlBEMB5xTUUxg2kewOIWPp\n97ze4LZiqnVgqnNgqi3EWGFH6PN33FKTpPojJHYPkewNkwrEMx3QgThaKJmpST6SSYdwGJB2PZpN\nR9Ep9RTOKhnTvnNR7fR2KeUPhBA/572hIqW8bUyRHQaVEJSprn8oxnee2cqzG3uYW17A/318Mcvq\nxnc9YU8iyaM9Ph7sGqArnqTKbOSqqhI+WVmSs4V8xtuGwV5+uXMdb3jS+KxVSKFDl05R5e1khT3F\nvy89lfKIHi2eRibSpANxEh2Z2dZaKFvEzqjDWJEZMSTMenRWA6bqAkz1hRjc1rz2uciUNjzXYc9P\nyh8nHdi7reRTCzA3Osf0/rlICBdIKZ8RQlxzwAOQ8sExRXYYVEJQpot/buvjjj9vpjcY4/qTZvHv\nZ8/DkqOO04NJS8kLA0Hu7xrglcHM8p/HOe2c53ZyYVnuVnkbb13hQX6/Yw2vtHTRoq9g0FmO0DTK\noh6cuhRFJsHsokJuXbCMRpuV9GCcREcw8828J5xJGrEU6XByuGUhrIbMEE+LAWE1YKqyY5rlxFxf\nOKGXnsaLumSkKJNcKJ7if5/bxu9X7aax1M4PLlnMMQ1jG1Z4qFoicf7cP8iz/X62hmMYBHy0rJjP\n1ro5MscL+YynRDrBvS/9ib/tGqDPXkXEaidqsRO2Z0qJ1IshPj2rkcuqyineb0iu1CSpgSiJ9iCJ\nziG0SAotlpk7kOyNgCZBgLAY0Fn06CwGjBV2zLOcmBqdGFyWA05cm4xy2an8AnCplNKfvV8MPCal\nPCcnkR4ClRCU6eiN5gFuf2IjXf4oFy2t4ivnzKOmeOI+lJsjMR7sGuCRHh/htMZxTjsfLy/mfHcR\nJRNcXO9wJOMx/J4+unta+dc7r/N60MjWOUvxusrRyTQnFRm5sqaOBquJMpOREqMB40E+0LVEmsTu\nIRLtQdKhBDKWRoskSXSFhi9BjUwWeocJQ4kVQ4kFvdOc6dS2Gff+thoOec5CLuUyIayXUi7db9vw\nnISJpBKCMl2F4il+/a9d/Oa1FiRww8mzuO2MOZgncMhoIJni9z0+Hu3xsjMSxyDgrBInt9SVcazz\n8Be+mWhDvgH+9ujdvLOtnS1zlrBl3mLi5r1FCPVonFps5dqaKk5zFY6qo11KScqTKXmRDsQziSKa\nylzz98ZIB+MH6HHN0NkMGNw2DO5M4tDZjehtxuFyGTp7NnGMQ6sjlwlhDXDxnhXShBD1wFNSymU5\nifQQqISgTHfd/ig/ej4zd2FRVSE//+RRNI7TENWDkVKyNRzjT72DPNbrxZdMc7zTzi11ZZw+yg/O\nyWTIO8DrTz3Cppdfos9VQbDQwWChjV5XCW31S0kZC3EZBPMKbJSZjFSYjJxRUshJxQWZyqSHQCa1\nzIzjSGq4DMae3+lAnKQnSmoggjaUPPAbCDItimyC0BfsvW07qgxjqXVMf4NcJoRzgXuAV7KbPgTc\nKKV8fkyRZd7zh8AFQALYBVy355LU+1EJQZkpXtzax5ef2EAypfHfFx/BR5dW52UUTDid5pFuH7/u\n6KcrnsRtMvCx8mI+UeFiQcHYPpzyJeTz8u7K1wn09xIc6Kd753ZCQ0OsXdTIugXzidtLwVBMQleI\nJozUWYxcUVnKUYU2yswGyk1Gigz6nJwHmUyTjmRrHYX3lu0evh/a734kRelnjsAyZ2wj0nK9pnIp\nmVnKAlgppRwYU1R73+9s4CUpZUoI8X0AKeVXP+h1KiEoM0m3P8oXHlvHO22DnD6/jG9fsIi6kvx0\n+CY1yYszEM7iAAAc80lEQVTeAH/oHeRFb5CklJxVUsgXG8pZVjj1LicBpBIJNv7z76x88jFiwSBS\nL0gVGBgskLy2oIa+ulMJm5r2ec1Cu4Urq0q4pMI1oWXIZbYg3ljnUeRi2Ol8KeV2IcQBLw1JKdeO\nKbL37udi4BIp5RUf9FyVEJSZJpXWeODNNn7ywg5SmuTW05q46dTZGHO07sJYeBMpHuoe4J4OD4Op\nNKe5HHyloYJlU7CfASAZi/Huytfw9XQR6Oulr3UXgb4eoi49L82P0lVWiGYoAkMZeufp+EUpVp1g\nicNGmdlIuclAg9XMEQVWFhVYKZiEpUJykRDukVLemF1Cc39SSnn64QaZ3c8zwONSyt990HNVQlBm\nqt5AjO/+dSt/3djDsQ3F/PJTyygrzG8pilAqzf1dA9zV0Y8vmeZ0l4OvzKrkqMKpM2z1QDQtzfY3\nXuXNP/yOQH8fwqBH57SRLDSwtqiD9bUOiio+gd4yi5A0E0jriWYrkwqgwmykzJS5xFRuNlJuMlJh\nNlJnMXGkw/qe4a8TIRcJ4VIp5R+FEI1SypYxBPAiUHGAh74hpXw6+5xvAMcAH5MHCUQIcSNwI0Bd\nXd3R7e3thxqKokwbT6/v4mt/2kSBxcCvrljGsRM0b+H9hFNp7huRGM4pLeSrsypZOMX6GPaXTiV5\nd+XreNpbCfT3MtCxm8HuTnSuAlbN7mdLqQdEZlCR1LuocJ1IYeFR6ExVxEUBIWnEk9DwJvddjr7B\namJRgZVKc6YDu8JspNJspNJsosJsxDYOrb9cJIS1Usple36PQ4DXADcBZ0gpIx/0fFAtBEUB2N4b\n5KaH19A5GOWW05r43GmzJ3R46sGEUmnu7fTwq45+gimNi8qK+OqsShpt5nyHlhNSSppXv8Ubjz2M\nt3M3eqMRa0kx+uICwi4dO51eVoltxOTeldOKzcXUFs7C7ZiLo2ABJvsi2hImdoRj9MSThNLae/ZT\nZNBnE4SRKrMpc9ti5DSXg0pznspfZ7/h64GjgFf3f1xKeeGYImN45NKdwClSSs9oX6cSgqJkBGNJ\nvvX0Fp5a10VTWQHf//iRHF2f/9YCgD+Z4q4OD/d0eEhKjSurSvlSfTllU6Q0xgfRtDQ7V62kp/ld\nAn29+Pt68HbsRkoNk9WGs74GrchMxC7xWWN0GrzspJP+RGYszmznbFZUr6CpqInygllYLdWEpZWe\nRJKeWDLzO56gO5akJ55kINvCeHzJbE5xOd4vtIPKRUIwAcuAh4Hr939cSvnKe140+uCaATOwp4T2\nW1LKmz7odSohKMq+Xn63nzue2kx3IMo1JzRw+7nzsE2S2cX98SQ/buvl9z1eTDodN9e6uaW2bFKv\nzzBWsVCI3Vs20L5hHf3tLfj7eokNBfd5jqO8nHRjEduK+3mTrcRJDD/msrhoKGxglnMWjc7GzO+i\nRirtlSQl9MaTlJoM2PV5WkJTCPGwlPKqPVVPxxRFjqmEoCjvFYqn+OHft/PgynZqXVa+//HFrJhd\nmu+whrVE4vxvSw/PePyUmQzcPquST1S4ptwEt0MVC4cI9PUy2NPFYE833Tu307F5A+lUCoPZTEGZ\nG11JAdFCHT5blA6jj3fZjTe9d0qWRW+hwZlJFNctuo4FJQvGFEsuEsJW4MPAX4BTyXSgD5NS+sYU\n2WFQCUFRDm5Vi5ev/mkjbd4IVx1fz9c/Mn/StBYA1gTC/Neubt4OhJlnt/Ct2VWcXlKY77AmVCIa\noX3jejq3b2GwuzMz1LW/D0Z8DttLSjC5i0gWmQgWJOk2+2kWPXzn7P/jqPKxVQzKRUK4DbgZaAS6\n2DchSCll45giOwwqISjK+4sm0vzoH+9y3xut1Lts/PiyJZOmbwEyHbPPDQT47q5u2qIJTi128K2m\nqik36zmXUokE/t5ufN2deLs6GOzuwtfdia+rk2Q8Nvy8C7/8DeYce8KY9pHL0hV3SSlvHlMUOaYS\ngqKMzspdXr7yxAa6/VE+e8psvnjm3HFbnW0sEprGA10D3NnWRzCV5oqqEm6fVYHbND06nnNBSsmQ\nd2A4OcxZfgIO19guBea6dMVJwBwp5f3ZMhYOKWXrmCI7DCohKMroheIpvvvMVh5f3cGiqkJ+evlS\n5pSPbZTKeBlMprizrZf7uwaw6HR8ob6cG2rcWPI4E3s6ymUL4VtkJo/Nk1LOFUJUAX+UUp6Ym1BH\nTyUERTl0z2/p5etPbiIcT/H1D8/nmhUNeV0u8kCaIzG+09zNP7xB6iwm/nN2Fee7nZMuzqlqtAlh\nNGn4YuBCIAwgpewGJtfXDEVRDuqcRRU8/28f4sSmUr79zFaue+AdPEPxD37hBGqyWXhocSN/WDIb\nm17HDVvauHhdM5uHRjVnVcmR0SSERLashAQQQkzNClaKMoO5HWZ+e80xfOeiRazc5eXDP3uVv2/u\nYbItofshl4MXj5nHD+bWsCMS46zVO/jy9g48iYOsH6Dk1GgSwh+EEHcDRUKIG4AXgd+Mb1iKouSa\nEIKrT2jgmc+fRGmBmZt+t5bL7l7Jut2D+Q5tHwad4OrqUlYuX8CNNW4e6/Vy4qpt3NPRT1KbXAls\nuhltp/JZwNlkhp4+L6V8YbwDOxDVh6AouZFKazy+uoOfvLCTgVCcS46u4b8uXITdPHnmLeyxMxzj\nm81dvOwbYo7NzDdnV3FmSaHqXzgEuR5lVA4cm737tpSy/zDjGxOVEBQlt0LxFL96uZlfv7KLRncB\nv7piGXMn2UgkyAzBfMEb5JvNXbRFEywqsHBrXTkXuIum/YznXMhZp7IQ4jLgbeBS4DJglRDiksMP\nUVGUfCswG7j93Pn87jPL8UeSXPSLN3js7d1ok+zSjBCCs0udvHrcfH42v46EJrl5azunvL2dV3xD\n+Q5v2hjNsNMNwFl7WgVCCDfwopRyyQTEtw/VQlCU8dMfjPGFx9azssXLUXVFfPuCRSypLcp3WAek\nScnzAwG+u6uHlmicC9xFfKupihrL2MpDT3e5nIewSUp55Ij7OmDDyG0TRSUERRlfmiZ5al0X//u3\n7XjDcT55XB3fPH8hFuPkrFAa1zR+tbufn7X3EdMklWYjC+1WjnPauaHWPS6LzUxFuUwIPwQWA49m\nN10ObJJS3n7YUR4ilRAUZWIMxZL87MWd3Pt6K0dUF3L3VcdQXTR56w21R+M86wmwLRRlSyjKtnCM\neouJH82r5eQxriEwneS6U/ljwElkRhm9KqV86vBDPHQqISjKxHphax9fenw9RoOOX3zqqElVVvv9\nvDkY4t/f3U1rNMEnK118e3YVzjysZTxZ5KLaaRNQLqV8Y7/tHwK6pJS7chLpIVAJQVEm3i5PiBsf\nWk3LQJgrltfxlXPm47RO/iJ00bTGj9p6uWt3P2UmIz+cV8NZpc58h5UXuRhl9FPgQN33kexjiqLM\nALPdBTx960lcu6KBR1bt5owfv8IzG7rzHdYHsup1/OfsKv569FycRj1XbWrlpi1t/LlvkJZIHG2S\nzdKeDN6vhbBZSnnEQR7bpDqVFWXm2dQZ4Bt/3sTGzgDXrmjgjvMWYJgCHbdxTeOnbX3c1dFPLDuk\nttig5+uNlVxVVTLtJ7nl4pJRs5Sy6VAfG08qIShK/qU1yfee28ZvX2/l5Dml/OJTy6bEJSTIrMOw\nIxxj41CUJ/sGed0f4jSXgzvn11Jpnr5DVnOREB4FXpJS/ma/7Z8BzpZSXp6TSA+BSgiKMnk8/s5u\n7vjzZmpdNn57zbHMKp1adS81KXmga4Dv7urGqBOc5ipkqcPGskIbxzrt6KZRqyEXCaEceApIAGuy\nm48BTMDFUsreHMU6aiohKMrksqrFy82/X0sqrfHLK5Zx8hx3vkM6ZC2RON9v7WF1IExXPFNVdUVR\nAT9fUEf1NJnolst5CKcBe/oStkgpX8pBfGOiEoKiTD4dvgg3PLSanf0h7jhvAddOwgV4RsuTSPKc\nJ8B3dnWjF/CDubV8tLw432EdtpzOQ5gsVEJQlMkpFE/xxcfX88LWPj5xbC3fueiISbWG86Fqi8a5\ndWs7q4MRqs1GlhXaObrQxsXlxZSbp0Z/yUgqISiKMqE0TfKTF3fw85eaOW6Wi19feTQu+9S95JLS\nJI/0eHndH2JtMExnLInLqOfOeXWc655a8xlUQlAUJS+eXt/F7U9sxO0wc9+1x07Kctpj8W44xq1b\n29kUinJtdSl3NFZSYJicNZ72pxKCoih5s6HDz/UPrSaWSPOrK6dmZ/OBxDWN77X0cHeHB72AhXYr\nRzvtnFVSyGkux6QdmaQSgqIoedXlj/KZB95hZ3+I//7oEXzyuLp8h5QzqwNhXvQGWRMMsy4YIZTW\nmG0185maUi6tcOGYZC0HlRAURcm7oViSWx9Zxys7PHz2lEa+es58dNNshbOkJnnW4+eeDg/rhiLo\ngPl2C8c47RxdaOdYp51ZVlNeR16phKAoyqSQSmt8+5kt/O6t3Zx3ZCU/vmzJpF1f4XCtDYT5py/I\n2mCENcEwwZQGgMuo51RXIZ+tdbPEYZvwuEabEGZuPVhFUSaEQa/juxcdQZ3Lxvee205PIMpvrj6G\nkgJzvkPLuWVOO8ucmRnbmpTsiMRYHYjwdiDE3zwBnuwb5JRiB9fXlLKiqAD7ZLu0pFoIiqJMlOc2\n9fDFx9dT6bRw/3XHTblyF4cjmErzUNcA93R66E+k0As4ssDGcqed44vsHOcsoMQ0Pt/R1SUjRVEm\npTXtg9zw0Go0KfnN1cdwbIMr3yFNqFha401/iFWBMKv8IdYNRYhnK7DOtVk4vsjOCUUFnFBUQEWO\nJsGphKAoyqTV7g1z3f3v0DkY5UeXLeHCJVX5Dilv4prG+mCEVYEwK/0h3gmECaUzfQ8NVtNwcjjd\nVUjpGFsQKiEoijKp+SMJbnx4DW+3+vjKOfO45dTZU7YGUi6lNMmWcJSVgyFWBkKs8ofxp9I8sriR\n00sKx/SeKiEoijLpxVNpbn9iI0+v7+byY2r574uPwDgFFtyZSJqUbA/HaLCasY3xb5OLJTTHnRDi\ny0IIKYSYGit3K4qSU2aDnp9evpTbTm/i8dUdXHf/OwRjyXyHNanohGBhgXXMyeCQ9jXuezgIIUQt\ncBawO18xKIqSf0IIvnT2PH54yWLeavFyyV1v0jkYyXdYM1I+Wwg/AW4Hps41K0VRxs2lx9Ty0KeP\noycQ46O/fJONnf58hzTj5CUhCCEuBLqklBtG8dwbhRCrhRCrPR7PBESnKEq+rGgq5cmbV2Ax6rjs\n7pU8v2XCF2ac0cYtIQghXhRCbD7Az0XAN4BvjuZ9pJT3SCmPkVIe43ZPj4qJiqIc3JxyB0/dciLz\nKgq56XdruPe1FqbS4JepbNxKV0gpzzzQdiHEkcAsYEN2iFkNsFYIcVw+1mlWFGXycTvMPHbD8Xzp\nD+v5779uo90b4VsXLMSgRiCNqwn/60opN0kpy6SUDVLKBqATWKaSgaIoI1lNen75qWV89kONPPxW\nO9c/tJpQPJXvsKY1lW4VRZm0dDrB1z+ygP+5+Ahe2znAJXe9Sbc/mu+wpq28J4RsS2Eg33EoijJ5\nXbG8nvuuPZbOwSjn/b/XeHp9l+pXGAd5TwiKoiijccpcN3/+3ArqS+x84bH1XP/ganoCqrWQSyoh\nKIoyZTSVOfjTzSu447wFvLFrgI/87DVWt/nyHda0oRKCoihTil4nuP7kRp677WScViOfuncVf93Y\nk++wpgWVEBRFmZIa3QU8ecuJHFnt5HOPrOUHf9/Oxk4/yWzpaOXQqWqniqJMabFkmq88sZFnNnQD\nYDHqOKmplO9/fPG0XKZzLFT5a0VRZpRuf5S1uwdZ3TbIo2/vptJp4aFPL6euZOIXtZ9spkT5a0VR\nlFypKrJy/uIqvn3hIh65YTn+aJKP3fUmm7sC+Q5tylAJQVGUaefoehdP3HQCZoOOy+9eyRvNaqrT\naKiEoCjKtLRniGpNsY1r73+bv2T7GJSDUwlBUZRpq8Jp4Q83ncBRtcXc9ug6fvNqC9FEOt9hTVqq\nU1lRlGkvlkzzhcfW8fyWPgw6wcKqQo5vLOFzpzbhtBnzHd64G22n8riVv1YURZksLEY9v7riaF7d\n6WF1m4/VbYPc93orr7zr4aHPHEd5oSXfIU4KqoWgKMqM9EbzADc+tJoim4mHP3Mcje6CfIc0btSw\nU0VRlPdxYlMpj914ArFkmkt+vZL/fW4bL2ztwxdO5Du0vFEtBEVRZrTWgTBff3Ija9v9JNIaQsAX\nz5zL509vIruq45Sn+hAURVFGYVapfbilsKkrwEMr27nzhR34wgm+ef5CdLrpkRRGQyUERVEUMh3P\nxza4OLquGHeBmfveaCUYTfK9jx2JxajPd3gTQiUERVGUEXQ6wX+evwCX3ciP/rGDZzf2sLjGyTEN\nLq5YXketa/rWRlKdyoqiKPsRQnDr6XN45IblXHdiA2kpufe1Fi7+1Zts7w3mO7xxozqVFUVRRqG5\nf4gr732baDLNg58+jqW1RfkOadTUsFNFUZQcaipz8MebTsBpNXLFb97iwTfbaO4fYip9qf4gqg9B\nURRllGpdNv540wl8+oF3+NZftgDgsps494gKbj5l9pTvX1CXjBRFUQ6RlJJ2b4S3W328uWuA5zb1\nkpaSjy6t5toVDSysKkQ/iYarqhXTFEVRJkhfMMbdr7TwyNvtxJIaDouB5bNcHN9YwvGNJSyozG+C\nUAlBURRlgnlDcV7bOcCqVi9vtfhoHQgD4LAYOHVeGZ8/vYm55Y4Jj0slBEVRlDzrC8Z4q8XLyl1e\nnt3YQziR4qIlVXz+jDnMnsBieiohKIqiTCKD4QR3v9rCA2+2EktqNJTYWNFUyklNpayYXUKRzTRu\n+1YJQVEUZRLqH4rx1409vNHs5a0WL6F4CiHgyGonJzWVcvIcN0fXF2My5G5WgEoIiqIok1wqrbGh\n08/rO728ttPDug4/aU1iM+k5obGEk+eU8qG5bmaV2g+r8qpKCIqiKFPMUCzJyl1eXm8e4NUdHtq8\nEQBqiq384JLFrJhdOqb3VeWvFUVRphiHxcjZiyo4e1EFALu9EV7Z6eHVHR4qndZx379KCIqiKJNU\nXYmNq0rquer4+gnZn6plpCiKogAqISiKoihZKiEoiqIoQB4TghDi80KId4UQW4QQP8hXHIqiKEpG\nXjqVhRCnARcBi6WUcSFEWT7iUBRFUfbKVwvhZuD/pJRxACllf57iUBRFUbLylRDmAicLIVYJIV4R\nQhx7sCcKIW4UQqwWQqz2eDwTGKKiKMrMMm6XjIQQLwIVB3joG9n9FgPHA8cCfxBCNMoDTJuWUt4D\n3AOZmcrjFa+iKMpMl5fSFUKIv5O5ZPSv7P1dwPFSyvdtAgghPED7GHdbCgyM8bVT2Uw87pl4zDAz\nj3smHjMc+nHXSyndH/SkfM1U/jNwOvAvIcRcwMQoDm40B3QwQojVo6nlMd3MxOOeiccMM/O4Z+Ix\nw/gdd74Swn3AfUKIzUACuOZAl4sURVGUiZOXhCClTABX5mPfiqIoyoHNpJnK9+Q7gDyZicc9E48Z\nZuZxz8RjhnE67im1HoKiKIoyfmZSC0FRFEV5HzMiIQghzs3WTWoWQnwt3/GMByFErRDiZSHEtmx9\nqC9kt7uEEC8IIXZmfxfnO9ZcE0LohRDrhBDPZu/Pyk563CmEeFwIMX6rl+eJEKJICPGEEGJ79pyf\nMN3PtRDii9l/25uFEI8KISzT8VwLIe4TQvRnB93s2XbAcysy/l/2s22jEGLZ4ex72icEIYQe+CXw\nYWAh8EkhxML8RjUuUsC/SykXkJnw97nscX4N+KeUcg7wz+z96eYLwLYR978P/CR7zIPAZ/IS1fj6\nGfB3KeV8YAmZ45+251oIUQ3cBhwjpTwC0AOfYHqe6weAc/fbdrBz+2FgTvbnRuCuw9nxtE8IwHFA\ns5SyJTu66TEyhfWmFSllj5Rybfb2EJkPiGoyx/pg9mkPAh/NT4TjQwhRA5wH3Ju9L8jMcXki+5Tp\neMyFwIeA30Jm1J6U0s80P9dkRkVahRAGwAb0MA3PtZTyVcC33+aDnduLgIdkxltAkRCicqz7ngkJ\noRroGHG/M7tt2hJCNABHAauAcillD2SSBjDdKsv+FLgd0LL3SwC/lDKVvT8dz3cj4AHuz14qu1cI\nYWcan2spZRfwI2A3mUQQANYw/c/1Hgc7tzn9fJsJCUEcYNu0HVolhCgA/gT8m5QymO94xpMQ4nyg\nX0q5ZuTmAzx1up1vA7AMuEtKeRQQZhpdHjqQ7DXzi4BZQBVgJ3O5ZH/T7Vx/kJz+e58JCaETqB1x\nvwbozlMs40oIYSSTDH4vpXwyu7lvTxMy+3s6lRo/EbhQCNFG5lLg6WRaDEXZywowPc93J9AppVyV\nvf8EmQQxnc/1mUCrlNIjpUwCTwIrmP7neo+Dnducfr7NhITwDjAnOxrBRKYj6i95jinnstfOfwts\nk1LeOeKhvwDXZG9fAzw90bGNFynl16WUNVLKBjLn9SUp5RXAy8Al2adNq2MGkFL2Ah1CiHnZTWcA\nW5nG55rMpaLjhRC27L/1Pcc8rc/1CAc7t38Brs6ONjoeCOy5tDQWM2JimhDiI2S+OeqB+6SU/5Pn\nkHJOCHES8Bqwib3X0/+DTD/CH4A6Mv+pLpVS7t9hNeUJIU4FviylPF8I0UimxeAC1gFX7lmMaboQ\nQiwl05FuAlqA68h8wZu251oI8V/A5WRG1K0DridzvXxanWshxKPAqWQqmvYB3yJTEPQ95zabHH9B\nZlRSBLhOSrl6zPueCQlBURRF+WAz4ZKRoiiKMgoqISiKoiiASgiKoihKlkoIiqIoCqASgqIoipKl\nEoIy7QghvpGtirlRCLFeCLE8u/3fhBC2cdrnkdl9rRdC+IQQrdnbL77Pa5qEEOvHIx5FGYt8rams\nKONCCHECcD6wTEoZF0KUkhmrD/BvwO/IjNfOKSnlJmBpNoYHgGellE+874sUZZJRLQRluqkEBvZM\nTpJSDkgpu4UQt5GpgfOyEOJlACHE2UKIlUKItUKIP2brQCGEaBNCfF8I8Xb2pym7/dJsLf4NQohX\nRxuQEKJQCPFSdj8bszWY9n9OU7ZQ3TIhhEEIcWd23xuFENdnn3OmEOKfQognRWZ9j4cO+6+lKCOo\nhKBMN/8AaoUQO4QQvxJCnAIgpfx/ZGq8nCalPC3bcrgDOFNKuQxYDXxpxPsEpZTHkZkF+tPstm8C\n50gplwAXHkJMUeCi7H7OBH4y8kEhxALgj8DV2RLmN5Ip2ncccCyZtS3qsk9fBnyOzNoeC7LlChQl\nJ1RCUKYVKWUIOJrMh6oHeFwIce0Bnno8mQ/VN7LX8a8B6kc8/uiI3ydkb78BPCCEuIFMGZTREsD3\nhRAb2ZuwSrOPlQNPAZ/MXnYCOBu4LhvXKqCIzAIoAG9l175IA+uBhkOIQ1Hel+pDUKad7Iflv4B/\nCSE2kfmwf2C/pwngBSnlJw/2NvvfllLelO2gPg9YL4RYKqX0jiKkqwEnmX6NlBCiE7BkH/OTabmc\nCGwfEdstUsp/7hOwEGcCI+v0pFH/h5UcUi0EZVoRQswTQswZsWkp0J69PQQ4srffAk4c0T9gE0LM\nHfG6y0f8Xpl9zmwp5Sop5TeBAfYtO/x+nGQuAaWEEGex7wImcTJ1/j8jhLgsu+154JY9ZZ2zx2Qd\n5b4UZczUtwtluikAfi6EKCJTFbOZzOUjgHuAvwkherL9CNcCjwohzNnH7wB2ZG+bhRCryHxp2tOK\n+GE22Qgy69puGGVMDwPPCCFWA2uBnSMflFKGsh3NLwghwsDdZKpars8Us6SfabjsqzL5qGqnirKf\n7II7x0gpB/Idi6JMJHXJSFEURQFUC0FRFEXJUi0ERVEUBVAJQVEURclSCUFRFEUBVEJQFEVRslRC\nUBRFUQCVEBRFUZSs/w+SsJ1APcIQyQAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fce75bc87f0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "__author__ = 'mike_bowles'\n",
    "import urllib.request, urllib.error, urllib.parse\n",
    "import sys\n",
    "from math import sqrt, fabs, exp\n",
    "import matplotlib.pyplot as plot\n",
    "\n",
    "def S(z,gamma):\n",
    "    if gamma >= fabs(z):\n",
    "        return 0.0\n",
    "    if z > 0.0:\n",
    "        return z - gamma\n",
    "    else:\n",
    "        return z + gamma\n",
    "\n",
    "def Pr(b0,b,x):\n",
    "    n = len(x)\n",
    "    sum = b0\n",
    "    for i in range(n):\n",
    "        sum += b[i]*x[i]\n",
    "        if sum < -100: sum = -100\n",
    "    return 1.0/(1.0 + exp(-sum))\n",
    "\n",
    "\n",
    "#read data from uci data repository\n",
    "target_url = \"https://archive.ics.uci.edu/ml/machine-learning-databases/undocumented/connectionist-bench/sonar/sonar.all-data\"\n",
    "data = urllib.request.urlopen(target_url)\n",
    "\n",
    "\n",
    "#arrange data into list for labels and list of lists for attributes\n",
    "xList = []\n",
    "\n",
    "\n",
    "for line in data:\n",
    "    #split on comma\n",
    "    row = line.decode().strip().split(\",\")\n",
    "    xList.append(row)\n",
    "\n",
    "#separate labels from attributes, convert from attributes from string to numeric and convert \"M\" to 1 and \"R\" to 0\n",
    "\n",
    "xNum = []\n",
    "labels = []\n",
    "\n",
    "for row in xList:\n",
    "    lastCol = row.pop()\n",
    "    if lastCol == \"M\":\n",
    "        labels.append(1.0)\n",
    "    else:\n",
    "        labels.append(0.0)\n",
    "    attrRow = [float(elt) for elt in row]\n",
    "    xNum.append(attrRow)\n",
    "\n",
    "#number of rows and columns in x matrix\n",
    "nrow = len(xNum)\n",
    "ncol = len(xNum[1])\n",
    "\n",
    "alpha = 1.0\n",
    "\n",
    "#calculate means and variances\n",
    "xMeans = []\n",
    "xSD = []\n",
    "for i in range(ncol):\n",
    "    col = [xNum[j][i] for j in range(nrow)]\n",
    "    mean = sum(col)/nrow\n",
    "    xMeans.append(mean)\n",
    "    colDiff = [(xNum[j][i] - mean) for j in range(nrow)]\n",
    "    sumSq = sum([colDiff[i] * colDiff[i] for i in range(nrow)])\n",
    "    stdDev = sqrt(sumSq/nrow)\n",
    "    xSD.append(stdDev)\n",
    "\n",
    "#use calculate mean and standard deviation to normalize xNum\n",
    "xNormalized = []\n",
    "for i in range(nrow):\n",
    "    rowNormalized = [(xNum[i][j] - xMeans[j])/xSD[j] for j in range(ncol)]\n",
    "    xNormalized.append(rowNormalized)\n",
    "\n",
    "#Do Not Normalize labels but do calculate averages\n",
    "meanLabel = sum(labels)/nrow\n",
    "sdLabel = sqrt(sum([(labels[i] - meanLabel) * (labels[i] - meanLabel) for i in range(nrow)])/nrow)\n",
    "\n",
    "#initialize probabilities and weights\n",
    "sumWxr = [0.0] * ncol\n",
    "sumWxx = [0.0] * ncol\n",
    "sumWr = 0.0\n",
    "sumW = 0.0\n",
    "\n",
    "#calculate starting points for betas\n",
    "for iRow in range(nrow):\n",
    "    p = meanLabel\n",
    "    w = p * (1.0 - p)\n",
    "    #residual for logistic\n",
    "    r = (labels[iRow] - p) / w\n",
    "    x = xNormalized[iRow]\n",
    "    sumWxr = [sumWxr[i] + w * x[i] * r for i in range(ncol)]\n",
    "    sumWxx = [sumWxx[i] + w * x[i] * x[i] for i in range(ncol)]\n",
    "    sumWr = sumWr + w * r\n",
    "    sumW = sumW + w\n",
    "\n",
    "avgWxr = [sumWxr[i]/nrow for i in range(ncol)]\n",
    "avgWxx = [sumWxx[i]/nrow for i in range(ncol)]\n",
    "\n",
    "maxWxr = 0.0\n",
    "for i in range(ncol):\n",
    "    val = abs(avgWxr[i])\n",
    "    if val > maxWxr:\n",
    "        maxWxr = val\n",
    "\n",
    "#calculate starting value for lambda\n",
    "lam = maxWxr/alpha\n",
    "\n",
    "#this value of lambda corresponds to beta = list of 0's\n",
    "#initialize a vector of coefficients beta\n",
    "beta = [0.0] * ncol\n",
    "beta0 = sumWr/sumW\n",
    "\n",
    "#initialize matrix of betas at each step\n",
    "betaMat = []\n",
    "betaMat.append(list(beta))\n",
    "\n",
    "beta0List = []\n",
    "beta0List.append(beta0)\n",
    "\n",
    "#begin iteration\n",
    "nSteps = 100\n",
    "lamMult = 0.93 #100 steps gives reduction by factor of 1000 in lambda (recommended by authors)\n",
    "nzList = []\n",
    "for iStep in range(nSteps):\n",
    "    #decrease lambda\n",
    "    lam = lam * lamMult\n",
    "\n",
    "\n",
    "    #Use incremental change in betas to control inner iteration\n",
    "\n",
    "\n",
    "    #set middle loop values for betas = to outer values\n",
    "    # values are used for calculating weights and probabilities\n",
    "    #inner values are used for calculating penalized regression updates\n",
    "\n",
    "    #take pass through data to calculate averages over data require for iteration\n",
    "    #initilize accumulators\n",
    "\n",
    "    betaIRLS = list(beta)\n",
    "    beta0IRLS = beta0\n",
    "    distIRLS = 100.0\n",
    "    #Middle loop to calculate new betas with fixed IRLS weights and probabilities\n",
    "    iterIRLS = 0\n",
    "    while distIRLS > 0.01:\n",
    "        iterIRLS += 1\n",
    "        iterInner = 0.0\n",
    "\n",
    "        betaInner = list(betaIRLS)\n",
    "        beta0Inner = beta0IRLS\n",
    "        distInner = 100.0\n",
    "        while distInner > 0.01:\n",
    "            iterInner += 1\n",
    "            if iterInner > 100: break\n",
    "\n",
    "            #cycle through attributes and update one-at-a-time\n",
    "            #record starting value for comparison\n",
    "            betaStart = list(betaInner)\n",
    "            for iCol in range(ncol):\n",
    "\n",
    "                sumWxr = 0.0\n",
    "                sumWxx = 0.0\n",
    "                sumWr = 0.0\n",
    "                sumW = 0.0\n",
    "\n",
    "                for iRow in range(nrow):\n",
    "                    x = list(xNormalized[iRow])\n",
    "                    y = labels[iRow]\n",
    "                    p = Pr(beta0IRLS, betaIRLS, x)\n",
    "                    if abs(p) < 1e-5:\n",
    "                        p = 0.0\n",
    "                        w = 1e-5\n",
    "                    elif abs(1.0 - p) < 1e-5:\n",
    "                        p = 1.0\n",
    "                        w = 1e-5\n",
    "                    else:\n",
    "                        w = p * (1.0 - p)\n",
    "\n",
    "                    z = (y - p) / w + beta0IRLS + sum([x[i] * betaIRLS[i] for i in range(ncol)])\n",
    "                    r = z - beta0Inner - sum([x[i] * betaInner[i] for i in range(ncol)])\n",
    "                    sumWxr += w * x[iCol] * r\n",
    "                    sumWxx += w * x[iCol] * x[iCol]\n",
    "                    sumWr += w * r\n",
    "                    sumW += w\n",
    "\n",
    "                avgWxr = sumWxr / nrow\n",
    "                avgWxx = sumWxx / nrow\n",
    "\n",
    "                beta0Inner = beta0Inner + sumWr / sumW\n",
    "                uncBeta = avgWxr + avgWxx * betaInner[iCol]\n",
    "                betaInner[iCol] = S(uncBeta, lam * alpha) / (avgWxx + lam * (1.0 - alpha))\n",
    "\n",
    "            sumDiff = sum([abs(betaInner[n] - betaStart[n]) for n in range(ncol)])\n",
    "            sumBeta = sum([abs(betaInner[n]) for n in range(ncol)])\n",
    "            distInner = sumDiff/sumBeta\n",
    "\n",
    "        print(iStep, iterIRLS, iterInner)\n",
    "\n",
    "        #if exit inner while loop, then set betaMiddle = betaMiddle and run through middle loop again.\n",
    "\n",
    "        #Check change in betaMiddle to see if IRLS is converged\n",
    "        a = sum([abs(betaIRLS[i] - betaInner[i]) for i in range(ncol)])\n",
    "        b = sum([abs(betaIRLS[i]) for i in range(ncol)])\n",
    "        distIRLS = a / (b + 0.0001)\n",
    "        dBeta = [betaInner[i] - betaIRLS[i] for i in range(ncol)]\n",
    "        gradStep = 1.0\n",
    "        temp = [betaIRLS[i] + gradStep * dBeta[i] for i in range(ncol)]\n",
    "        betaIRLS = list(temp)\n",
    "\n",
    "    beta = list(betaIRLS)\n",
    "    beta0 = beta0IRLS\n",
    "    betaMat.append(list(beta))\n",
    "    beta0List.append(beta0)\n",
    "\n",
    "    nzBeta = [index for index in range(ncol) if beta[index] != 0.0]\n",
    "    for q in nzBeta:\n",
    "        if not(q in nzList):\n",
    "            nzList.append(q)\n",
    "\n",
    "#make up names for columns of xNum\n",
    "names = ['V' + str(i) for i in range(ncol)]\n",
    "nameList = [names[nzList[i]] for i in range(len(nzList))]\n",
    "\n",
    "print(nameList)\n",
    "for i in range(ncol):\n",
    "    #plot range of beta values for each attribute\n",
    "    coefCurve = [betaMat[k][i] for k in range(nSteps)]\n",
    "    xaxis = range(nSteps)\n",
    "    plot.plot(xaxis, coefCurve)\n",
    "\n",
    "plot.xlabel(\"Steps Taken\")\n",
    "plot.ylabel(\"Coefficient Values\")\n",
    "plot.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### glmnetWine2.py"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 2\n",
      "1 2\n",
      "2 2\n",
      "3 3\n",
      "4 3\n",
      "5 3\n",
      "6 3\n",
      "7 3\n",
      "8 3\n",
      "9 2\n",
      "10 2\n",
      "11 2\n",
      "12 2\n",
      "13 3\n",
      "14 3\n",
      "15 2\n",
      "16 2\n",
      "17 2\n",
      "18 2\n",
      "19 2\n",
      "20 2\n",
      "21 2\n",
      "22 2\n",
      "23 2\n",
      "24 2\n",
      "25 2\n",
      "26 2\n",
      "27 2\n",
      "28 2\n",
      "29 3\n",
      "30 3\n",
      "31 3\n",
      "32 2\n",
      "33 3\n",
      "34 2\n",
      "35 2\n",
      "36 2\n",
      "37 2\n",
      "38 2\n",
      "39 2\n",
      "40 2\n",
      "41 2\n",
      "42 1\n",
      "43 1\n",
      "44 2\n",
      "45 2\n",
      "46 2\n",
      "47 1\n",
      "48 2\n",
      "49 1\n",
      "50 1\n",
      "51 1\n",
      "52 1\n",
      "53 1\n",
      "54 1\n",
      "55 1\n",
      "56 1\n",
      "57 1\n",
      "58 1\n",
      "59 1\n",
      "60 1\n",
      "61 1\n",
      "62 1\n",
      "63 1\n",
      "64 1\n",
      "65 1\n",
      "66 1\n",
      "67 1\n",
      "68 1\n",
      "69 1\n",
      "70 1\n",
      "71 1\n",
      "72 1\n",
      "73 1\n",
      "74 1\n",
      "75 1\n",
      "76 1\n",
      "77 1\n",
      "78 1\n",
      "79 1\n",
      "80 1\n",
      "81 1\n",
      "82 1\n",
      "83 1\n",
      "84 1\n",
      "85 1\n",
      "86 1\n",
      "87 1\n",
      "88 1\n",
      "89 1\n",
      "90 1\n",
      "91 1\n",
      "92 1\n",
      "93 1\n",
      "94 1\n",
      "95 1\n",
      "96 1\n",
      "97 1\n",
      "98 1\n",
      "99 1\n",
      "['\"alcohol\"', '\"volatile acidity\"', '\"sulphates\"', '\"total sulfur dioxide\"', '\"chlorides\"', '\"fixed acidity\"', '\"pH\"', '\"free sulfur dioxide\"', '\"residual sugar\"', '\"citric acid\"', '\"density\"']\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fce98c22f98>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "__author__ = 'mike-bowles'\n",
    "\n",
    "import urllib.request, urllib.error, urllib.parse\n",
    "import numpy\n",
    "from sklearn import datasets, linear_model\n",
    "from math import sqrt\n",
    "import matplotlib.pyplot as plot\n",
    "def S(z, gamma):\n",
    "    if gamma >= abs(z):\n",
    "        return 0.0\n",
    "    return (z/abs(z))*(abs(z) - gamma)\n",
    "\n",
    "#read data into iterable\n",
    "target_url = (\"http://archive.ics.uci.edu/ml/machine-learning-\"\n",
    "\"databases/wine-quality/winequality-red.csv\")\n",
    "data = urllib.request.urlopen(target_url)\n",
    "\n",
    "xList = []\n",
    "labels = []\n",
    "names = []\n",
    "firstLine = True\n",
    "for line in data:\n",
    "    if firstLine:\n",
    "        names = line.decode().strip().split(\";\")\n",
    "        firstLine = False\n",
    "    else:\n",
    "        #split on semi-colon\n",
    "        row = line.decode().strip().split(\";\")\n",
    "        #put labels in separate array\n",
    "        labels.append(float(row[-1]))\n",
    "        #remove label from row\n",
    "        row.pop()\n",
    "        #convert row to floats\n",
    "        floatRow = [float(num) for num in row]\n",
    "        xList.append(floatRow)\n",
    "\n",
    "#Normalize columns in x and labels\n",
    "\n",
    "nrows = len(xList)\n",
    "ncols = len(xList[0])\n",
    "\n",
    "#calculate means and variances\n",
    "xMeans = []\n",
    "xSD = []\n",
    "for i in range(ncols):\n",
    "    col = [xList[j][i] for j in range(nrows)]\n",
    "    mean = sum(col)/nrows\n",
    "    xMeans.append(mean)\n",
    "    colDiff = [(xList[j][i] - mean) for j in range(nrows)]\n",
    "    sumSq = sum([colDiff[i] * colDiff[i] for i in range(nrows)])\n",
    "    stdDev = sqrt(sumSq/nrows)\n",
    "    xSD.append(stdDev)\n",
    "\n",
    "#use calculate mean and standard deviation to normalize xList\n",
    "xNormalized = []\n",
    "for i in range(nrows):\n",
    "    rowNormalized = [(xList[i][j] - xMeans[j])/xSD[j]\n",
    "                     for j in range(ncols)]\n",
    "    xNormalized.append(rowNormalized)\n",
    "\n",
    "#Normalize labels\n",
    "meanLabel = sum(labels)/nrows\n",
    "sdLabel = sqrt(sum([(labels[i] - meanLabel) * (labels[i] -\n",
    "                meanLabel) for i in range(nrows)])/nrows)\n",
    "\n",
    "labelNormalized = [(labels[i] - meanLabel)/sdLabel for i in range(nrows)]\n",
    "\n",
    "#select value for alpha parameter\n",
    "\n",
    "alpha = 1.0\n",
    "\n",
    "#make a pass through the data to determine value of lambda that\n",
    "# just suppresses all coefficients.\n",
    "#start with betas all equal to zero.\n",
    "\n",
    "\n",
    "xy = [0.0]*ncols\n",
    "for i in range(nrows):\n",
    "    for j in range(ncols):\n",
    "        xy[j] += xNormalized[i][j] * labelNormalized[i]\n",
    "\n",
    "maxXY = 0.0\n",
    "for i in range(ncols):\n",
    "    val = abs(xy[i])/nrows\n",
    "    if val > maxXY:\n",
    "        maxXY = val\n",
    "\n",
    "#calculate starting value for lambda\n",
    "lam = maxXY/alpha\n",
    "\n",
    "#this value of lambda corresponds to beta = list of 0's\n",
    "#initialize a vector of coefficients beta\n",
    "beta = [0.0] * ncols\n",
    "\n",
    "#initialize matrix of betas at each step\n",
    "betaMat = []\n",
    "betaMat.append(list(beta))\n",
    "\n",
    "#begin iteration\n",
    "nSteps = 100\n",
    "lamMult = 0.93 #100 steps gives reduction by factor of 1000 in\n",
    "               # lambda (recommended by authors)\n",
    "nzList = []\n",
    "\n",
    "for iStep in range(nSteps):\n",
    "    #make lambda smaller so that some coefficient becomes non-zero\n",
    "    lam = lam * lamMult\n",
    "\n",
    "    deltaBeta = 100.0\n",
    "    eps = 0.01\n",
    "    iterStep = 0\n",
    "    betaInner = list(beta)\n",
    "    while deltaBeta > eps:\n",
    "        iterStep += 1\n",
    "        if iterStep > 100: break\n",
    "\n",
    "        #cycle through attributes and update one-at-a-time\n",
    "        #record starting value for comparison\n",
    "        betaStart = list(betaInner)\n",
    "        for iCol in range(ncols):\n",
    "\n",
    "            xyj = 0.0\n",
    "            for i in range(nrows):\n",
    "                #calculate residual with current value of beta\n",
    "                labelHat = sum([xNormalized[i][k]*betaInner[k]\n",
    "                                for k in range(ncols)])\n",
    "                residual = labelNormalized[i] - labelHat\n",
    "\n",
    "                xyj += xNormalized[i][iCol] * residual\n",
    "\n",
    "            uncBeta = xyj/nrows + betaInner[iCol]\n",
    "            betaInner[iCol] = S(uncBeta, lam * alpha) / (1 +\n",
    "                                            lam * (1 - alpha))\n",
    "\n",
    "        sumDiff = sum([abs(betaInner[n] - betaStart[n])\n",
    "                       for n in range(ncols)])\n",
    "        sumBeta = sum([abs(betaInner[n]) for n in range(ncols)])\n",
    "        deltaBeta = sumDiff/sumBeta\n",
    "    print(iStep, iterStep)\n",
    "    beta = betaInner\n",
    "\n",
    "    #add newly determined beta to list\n",
    "    betaMat.append(beta)\n",
    "\n",
    "    #keep track of the order in which the betas become non-zero\n",
    "    nzBeta = [index for index in range(ncols) if beta[index] != 0.0]\n",
    "    for q in nzBeta:\n",
    "        if (q in nzList) == False:\n",
    "            nzList.append(q)\n",
    "\n",
    "#print out the ordered list of betas\n",
    "nameList = [names[nzList[i]] for i in range(len(nzList))]\n",
    "print(nameList)\n",
    "\n",
    "nPts = len(betaMat)\n",
    "for i in range(ncols):\n",
    "    #plot range of beta values for each attribute\n",
    "    coefCurve = [betaMat[k][i] for k in range(nPts)]\n",
    "    xaxis = range(nPts)\n",
    "    plot.plot(xaxis, coefCurve)\n",
    "\n",
    "plot.xlabel(\"Steps Taken\")\n",
    "plot.ylabel((\"Coefficient Values\"))\n",
    "plot.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### larsAbalone.py"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['Shell weight', 'Height', 'Sex2', 'Shucked weight', 'Diameter', 'Sex1']\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nSw8CJgAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fce844f5048>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "__author__ = 'mike_bowles'\n",
    "\n",
    "import urllib.request, urllib.error, urllib.parse\n",
    "from pylab import *\n",
    "import matplotlib.pyplot as plot\n",
    "\n",
    "target_url = \"http://archive.ics.uci.edu/ml/machine-learning-databases/abalone/abalone.data\"\n",
    "#read abalone data\n",
    "data = urllib.request.urlopen(target_url)\n",
    "\n",
    "xList = []\n",
    "labels = []\n",
    "\n",
    "for line in data:\n",
    "    #split on semi-colon\n",
    "    row = line.decode().strip().split(\",\")\n",
    "\n",
    "    #put labels in separate array and remove label from row\n",
    "    labels.append(float(row.pop()))\n",
    "\n",
    "    #form list of list of attributes (all strings)\n",
    "    xList.append(row)\n",
    "\n",
    "names = ['Sex', 'Length', 'Diameter', 'Height', 'Whole weight', 'Shucked weight', 'Viscera weight', 'Shell weight', 'Rings']\n",
    "\n",
    "#code three-valued sex attribute as numeric\n",
    "xCoded = []\n",
    "for row in xList:\n",
    "    #first code the three-valued sex variable\n",
    "    codedSex = [0.0, 0.0]\n",
    "    if row[0] == 'M': codedSex[0] = 1.0\n",
    "    if row[0] == 'F': codedSex[1] = 1.0\n",
    "\n",
    "    numRow = [float(row[i]) for i in range(1,len(row))]\n",
    "    rowCoded = list(codedSex) + numRow\n",
    "    xCoded.append(rowCoded)\n",
    "\n",
    "namesCoded = ['Sex1', 'Sex2', 'Length', 'Diameter', 'Height', 'Whole weight', 'Shucked weight', 'Viscera weight', 'Shell weight', 'Rings']\n",
    "\n",
    "nrows = len(xCoded)\n",
    "ncols = len(xCoded[1])\n",
    "\n",
    "xMeans = []\n",
    "xSD = []\n",
    "for i in range(ncols):\n",
    "    col = [xCoded[j][i] for j in range(nrows)]\n",
    "    mean = sum(col)/nrows\n",
    "    xMeans.append(mean)\n",
    "    colDiff = [(xCoded[j][i] - mean) for j in range(nrows)]\n",
    "    sumSq = sum([colDiff[i] * colDiff[i] for i in range(nrows)])\n",
    "    stdDev = sqrt(sumSq/nrows)\n",
    "    xSD.append(stdDev)\n",
    "\n",
    "#use calculate mean and standard deviation to normalize xCoded\n",
    "xNormalized = []\n",
    "for i in range(nrows):\n",
    "    rowNormalized = [(xCoded[i][j] - xMeans[j])/xSD[j] for j in range(ncols)]\n",
    "    xNormalized.append(rowNormalized)\n",
    "\n",
    "#Normalize labels\n",
    "meanLabel = sum(labels)/nrows\n",
    "sdLabel = sqrt(sum([(labels[i] - meanLabel) * (labels[i] - meanLabel) for i in range(nrows)])/nrows)\n",
    "\n",
    "labelNormalized = [(labels[i] - meanLabel)/sdLabel for i in range(nrows)]\n",
    "\n",
    "#initialize a vector of coefficients beta\n",
    "beta = [0.0] * ncols\n",
    "\n",
    "#initialize matrix of betas at each step\n",
    "betaMat = []\n",
    "betaMat.append(list(beta))\n",
    "\n",
    "\n",
    "#number of steps to take\n",
    "nSteps = 350\n",
    "stepSize = 0.004\n",
    "nzList = []\n",
    "\n",
    "for i in range(nSteps):\n",
    "    #calculate residuals\n",
    "    residuals = [0.0] * nrows\n",
    "    for j in range(nrows):\n",
    "        labelsHat = sum([xNormalized[j][k] * beta[k] for k in range(ncols)])\n",
    "        residuals[j] = labelNormalized[j] - labelsHat\n",
    "\n",
    "    #calculate correlation between attribute columns from normalized wine and residual\n",
    "    corr = [0.0] * ncols\n",
    "\n",
    "    for j in range(ncols):\n",
    "        corr[j] = sum([xNormalized[k][j] * residuals[k] for k in range(nrows)]) / nrows\n",
    "\n",
    "    iStar = 0\n",
    "    corrStar = corr[0]\n",
    "\n",
    "    for j in range(1, (ncols)):\n",
    "        if abs(corrStar) < abs(corr[j]):\n",
    "            iStar = j; corrStar = corr[j]\n",
    "\n",
    "    beta[iStar] += stepSize * corrStar / abs(corrStar)\n",
    "    betaMat.append(list(beta))\n",
    "\n",
    "\n",
    "    nzBeta = [index for index in range(ncols) if beta[index] != 0.0]\n",
    "    for q in nzBeta:\n",
    "        if (q in nzList) == False:\n",
    "            nzList.append(q)\n",
    "\n",
    "nameList = [namesCoded[nzList[i]] for i in range(len(nzList))]\n",
    "\n",
    "print(nameList)\n",
    "for i in range(ncols):\n",
    "    #plot range of beta values for each attribute\n",
    "    coefCurve = [betaMat[k][i] for k in range(nSteps)]\n",
    "    xaxis = range(nSteps)\n",
    "    plot.plot(xaxis, coefCurve)\n",
    "\n",
    "plot.xlabel(\"Steps Taken\")\n",
    "plot.ylabel((\"Coefficient Values\"))\n",
    "plot.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### larsRocksVMines.py"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['V10', 'V48', 'V44', 'V11', 'V35', 'V51', 'V20', 'V3', 'V21', 'V15', 'V43', 'V0', 'V22', 'V45', 'V53', 'V27', 'V30', 'V50', 'V58', 'V46', 'V56', 'V28', 'V39']\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fce75c675c0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "__author__ = 'mike_bowles'\n",
    "import urllib.request, urllib.error, urllib.parse\n",
    "import sys\n",
    "from math import sqrt\n",
    "import matplotlib.pyplot as plot\n",
    "\n",
    "#read data from uci data repository\n",
    "target_url = \"https://archive.ics.uci.edu/ml/machine-learning-databases/undocumented/connectionist-bench/sonar/sonar.all-data\"\n",
    "data = urllib.request.urlopen(target_url)\n",
    "\n",
    "\n",
    "#arrange data into list for labels and list of lists for attributes\n",
    "xList = []\n",
    "\n",
    "\n",
    "for line in data:\n",
    "    #split on comma\n",
    "    row = line.decode().strip().split(\",\")\n",
    "    xList.append(row)\n",
    "\n",
    "#separate labels from attributes, convert from attributes from string to numeric and convert \"M\" to 1 and \"R\" to 0\n",
    "\n",
    "xNum = []\n",
    "labels = []\n",
    "\n",
    "for row in xList:\n",
    "    lastCol = row.pop()\n",
    "    if lastCol == \"M\":\n",
    "        labels.append(1.0)\n",
    "    else:\n",
    "        labels.append(0.0)\n",
    "    attrRow = [float(elt) for elt in row]\n",
    "    xNum.append(attrRow)\n",
    "\n",
    "#number of rows and columns in x matrix\n",
    "nrow = len(xNum)\n",
    "ncol = len(xNum[1])\n",
    "\n",
    "\n",
    "\n",
    "#calculate means and variances\n",
    "xMeans = []\n",
    "xSD = []\n",
    "for i in range(ncol):\n",
    "    col = [xNum[j][i] for j in range(nrow)]\n",
    "    mean = sum(col)/nrow\n",
    "    xMeans.append(mean)\n",
    "    colDiff = [(xNum[j][i] - mean) for j in range(nrow)]\n",
    "    sumSq = sum([colDiff[i] * colDiff[i] for i in range(nrow)])\n",
    "    stdDev = sqrt(sumSq/nrow)\n",
    "    xSD.append(stdDev)\n",
    "\n",
    "#use calculate mean and standard deviation to normalize xNum\n",
    "xNormalized = []\n",
    "for i in range(nrow):\n",
    "    rowNormalized = [(xNum[i][j] - xMeans[j])/xSD[j] for j in range(ncol)]\n",
    "    xNormalized.append(rowNormalized)\n",
    "\n",
    "#Normalize labels\n",
    "meanLabel = sum(labels)/nrow\n",
    "sdLabel = sqrt(sum([(labels[i] - meanLabel) * (labels[i] - meanLabel) for i in range(nrow)])/nrow)\n",
    "\n",
    "labelNormalized = [(labels[i] - meanLabel)/sdLabel for i in range(nrow)]\n",
    "\n",
    "#initialize a vector of coefficients beta\n",
    "beta = [0.0] * ncol\n",
    "\n",
    "#initialize matrix of betas at each step\n",
    "betaMat = []\n",
    "betaMat.append(list(beta))\n",
    "\n",
    "\n",
    "#number of steps to take\n",
    "nSteps = 350\n",
    "stepSize = 0.004\n",
    "nzList = []\n",
    "\n",
    "for i in range(nSteps):\n",
    "    #calculate residuals\n",
    "    residuals = [0.0] * nrow\n",
    "    for j in range(nrow):\n",
    "        labelsHat = sum([xNormalized[j][k] * beta[k] for k in range(ncol)])\n",
    "        residuals[j] = labelNormalized[j] - labelsHat\n",
    "\n",
    "    #calculate correlation between attribute columns from normalized wine and residual\n",
    "    corr = [0.0] * ncol\n",
    "\n",
    "    for j in range(ncol):\n",
    "        corr[j] = sum([xNormalized[k][j] * residuals[k] for k in range(nrow)]) / nrow\n",
    "\n",
    "    iStar = 0\n",
    "    corrStar = corr[0]\n",
    "\n",
    "    for j in range(1, (ncol)):\n",
    "        if abs(corrStar) < abs(corr[j]):\n",
    "            iStar = j; corrStar = corr[j]\n",
    "\n",
    "    beta[iStar] += stepSize * corrStar / abs(corrStar)\n",
    "    betaMat.append(list(beta))\n",
    "\n",
    "\n",
    "    nzBeta = [index for index in range(ncol) if beta[index] != 0.0]\n",
    "    for q in nzBeta:\n",
    "        if (q in nzList) == False:\n",
    "            nzList.append(q)\n",
    "\n",
    "#make up names for columns of xNum\n",
    "names = ['V' + str(i) for i in range(ncol)]\n",
    "nameList = [names[nzList[i]] for i in range(len(nzList))]\n",
    "\n",
    "print(nameList)\n",
    "for i in range(ncol):\n",
    "    #plot range of beta values for each attribute\n",
    "    coefCurve = [betaMat[k][i] for k in range(nSteps)]\n",
    "    xaxis = range(nSteps)\n",
    "    plot.plot(xaxis, coefCurve)\n",
    "\n",
    "plot.xlabel(\"Steps Taken\")\n",
    "plot.ylabel((\"Coefficient Values\"))\n",
    "plot.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### larsWine2.py"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['\"alcohol\"', '\"volatile acidity\"', '\"sulphates\"', '\"total sulfur dioxide\"', '\"chlorides\"', '\"fixed acidity\"', '\"pH\"', '\"free sulfur dioxide\"', '\"citric acid\"', '\"residual sugar\"', '\"density\"']\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nUpr/AStFDSj+OnNkAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fce61a86470>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "__author__ = 'mike-bowles'\n",
    "\n",
    "import urllib.request, urllib.error, urllib.parse\n",
    "import numpy\n",
    "from sklearn import datasets, linear_model\n",
    "from math import sqrt\n",
    "import matplotlib.pyplot as plot\n",
    "\n",
    "#read data into iterable\n",
    "target_url = \"http://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv\"\n",
    "data = urllib.request.urlopen(target_url)\n",
    "\n",
    "xList = []\n",
    "labels = []\n",
    "names = []\n",
    "firstLine = True\n",
    "for line in data:\n",
    "    if firstLine:\n",
    "        names = line.decode().strip().split(\";\")\n",
    "        firstLine = False\n",
    "    else:\n",
    "        #split on semi-colon\n",
    "        row = line.decode().strip().split(\";\")\n",
    "        #put labels in separate array\n",
    "        labels.append(float(row[-1]))\n",
    "        #remove label from row\n",
    "        row.pop()\n",
    "        #convert row to floats\n",
    "        floatRow = [float(num) for num in row]\n",
    "        xList.append(floatRow)\n",
    "\n",
    "#Normalize columns in x and labels\n",
    "\n",
    "nrows = len(xList)\n",
    "ncols = len(xList[0])\n",
    "\n",
    "#calculate means and variances\n",
    "xMeans = []\n",
    "xSD = []\n",
    "for i in range(ncols):\n",
    "    col = [xList[j][i] for j in range(nrows)]\n",
    "    mean = sum(col)/nrows\n",
    "    xMeans.append(mean)\n",
    "    colDiff = [(xList[j][i] - mean) for j in range(nrows)]\n",
    "    sumSq = sum([colDiff[i] * colDiff[i] for i in range(nrows)])\n",
    "    stdDev = sqrt(sumSq/nrows)\n",
    "    xSD.append(stdDev)\n",
    "\n",
    "#use calculate mean and standard deviation to normalize xList\n",
    "xNormalized = []\n",
    "for i in range(nrows):\n",
    "    rowNormalized = [(xList[i][j] - xMeans[j])/xSD[j] for j in range(ncols)]\n",
    "    xNormalized.append(rowNormalized)\n",
    "\n",
    "#Normalize labels\n",
    "meanLabel = sum(labels)/nrows\n",
    "sdLabel = sqrt(sum([(labels[i] - meanLabel) * (labels[i] - meanLabel) for i in range(nrows)])/nrows)\n",
    "\n",
    "labelNormalized = [(labels[i] - meanLabel)/sdLabel for i in range(nrows)]\n",
    "\n",
    "#initialize a vector of coefficients beta\n",
    "beta = [0.0] * ncols\n",
    "\n",
    "#initialize matrix of betas at each step\n",
    "betaMat = []\n",
    "betaMat.append(list(beta))\n",
    "\n",
    "\n",
    "#number of steps to take\n",
    "nSteps = 350\n",
    "stepSize = 0.004\n",
    "nzList = []\n",
    "\n",
    "for i in range(nSteps):\n",
    "    #calculate residuals\n",
    "    residuals = [0.0] * nrows\n",
    "    for j in range(nrows):\n",
    "        labelsHat = sum([xNormalized[j][k] * beta[k] for k in range(ncols)])\n",
    "        residuals[j] = labelNormalized[j] - labelsHat\n",
    "\n",
    "    #calculate correlation between attribute columns from normalized wine and residual\n",
    "    corr = [0.0] * ncols\n",
    "\n",
    "    for j in range(ncols):\n",
    "        corr[j] = sum([xNormalized[k][j] * residuals[k] for k in range(nrows)]) / nrows\n",
    "\n",
    "    iStar = 0\n",
    "    corrStar = corr[0]\n",
    "\n",
    "    for j in range(1, (ncols)):\n",
    "        if abs(corrStar) < abs(corr[j]):\n",
    "            iStar = j; corrStar = corr[j]\n",
    "\n",
    "    beta[iStar] += stepSize * corrStar / abs(corrStar)\n",
    "    betaMat.append(list(beta))\n",
    "\n",
    "\n",
    "    nzBeta = [index for index in range(ncols) if beta[index] != 0.0]\n",
    "    for q in nzBeta:\n",
    "        if (q in nzList) == False:\n",
    "            nzList.append(q)\n",
    "\n",
    "nameList = [names[nzList[i]] for i in range(len(nzList))]\n",
    "\n",
    "print(nameList)\n",
    "for i in range(ncols):\n",
    "    #plot range of beta values for each attribute\n",
    "    coefCurve = [betaMat[k][i] for k in range(nSteps)]\n",
    "    xaxis = range(nSteps)\n",
    "    plot.plot(xaxis, coefCurve)\n",
    "\n",
    "plot.xlabel(\"Steps Taken\")\n",
    "plot.ylabel((\"Coefficient Values\"))\n",
    "plot.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### larsWineCV.py"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Minimum Mean Square Error 0.587301893314\n",
      "Index of Minimum Mean Square Error 311\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fce61a86390>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "__author__ = 'mike-bowles'\n",
    "\n",
    "import urllib.request, urllib.error, urllib.parse\n",
    "import numpy\n",
    "from sklearn import datasets, linear_model\n",
    "from math import sqrt\n",
    "import matplotlib.pyplot as plot\n",
    "\n",
    "\n",
    "#read data into iterable\n",
    "target_url = \"http://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv\"\n",
    "data = urllib.request.urlopen(target_url)\n",
    "\n",
    "xList = []\n",
    "labels = []\n",
    "names = []\n",
    "firstLine = True\n",
    "for line in data:\n",
    "    if firstLine:\n",
    "        names = line.decode().strip().split(\";\")\n",
    "        firstLine = False\n",
    "    else:\n",
    "        #split on semi-colon\n",
    "        row = line.decode().strip().split(\";\")\n",
    "        #put labels in separate array\n",
    "        labels.append(float(row[-1]))\n",
    "        #remove label from row\n",
    "        row.pop()\n",
    "        #convert row to floats\n",
    "        floatRow = [float(num) for num in row]\n",
    "        xList.append(floatRow)\n",
    "\n",
    "#Normalize columns in x and labels\n",
    "\n",
    "nrows = len(xList)\n",
    "ncols = len(xList[0])\n",
    "\n",
    "#calculate means and variances\n",
    "xMeans = []\n",
    "xSD = []\n",
    "for i in range(ncols):\n",
    "    col = [xList[j][i] for j in range(nrows)]\n",
    "    mean = sum(col)/nrows\n",
    "    xMeans.append(mean)\n",
    "    colDiff = [(xList[j][i] - mean) for j in range(nrows)]\n",
    "    sumSq = sum([colDiff[i] * colDiff[i] for i in range(nrows)])\n",
    "    stdDev = sqrt(sumSq/nrows)\n",
    "    xSD.append(stdDev)\n",
    "\n",
    "#use calculated mean and standard deviation to normalize xList\n",
    "xNormalized = []\n",
    "for i in range(nrows):\n",
    "    rowNormalized = [(xList[i][j] - xMeans[j])/xSD[j] for j in range(ncols)]\n",
    "    xNormalized.append(rowNormalized)\n",
    "\n",
    "#Normalize labels\n",
    "meanLabel = sum(labels)/nrows\n",
    "sdLabel = sqrt(sum([(labels[i] - meanLabel) * (labels[i] - meanLabel) for i in range(nrows)])/nrows)\n",
    "\n",
    "labelNormalized = [(labels[i] - meanLabel)/sdLabel for i in range(nrows)]\n",
    "\n",
    "#Build cross-validation loop to determine best coefficient values.\n",
    "\n",
    "#number of cross validation folds\n",
    "nxval = 10\n",
    "\n",
    "#number of steps and step size\n",
    "nSteps = 350\n",
    "stepSize = 0.004\n",
    "\n",
    "#initialize list for storing errors.\n",
    "errors = []\n",
    "for i in range(nSteps):\n",
    "    b = []\n",
    "    errors.append(b)\n",
    "\n",
    "\n",
    "for ixval in range(nxval):\n",
    "    #Define test and training index sets\n",
    "    idxTest = [a for a in range(nrows) if a%nxval == ixval*nxval]\n",
    "    idxTrain = [a for a in range(nrows) if a%nxval != ixval*nxval]\n",
    "\n",
    "    #Define test and training attribute and label sets\n",
    "    xTrain = [xNormalized[r] for r in idxTrain]\n",
    "    xTest = [xNormalized[r] for r in idxTest]\n",
    "    labelTrain = [labelNormalized[r] for r in idxTrain]\n",
    "    labelTest = [labelNormalized[r] for r in idxTest]\n",
    "\n",
    "    #Train LARS regression on Training Data\n",
    "    nrowsTrain = len(idxTrain)\n",
    "    nrowsTest = len(idxTest)\n",
    "\n",
    "    #initialize a vector of coefficients beta\n",
    "    beta = [0.0] * ncols\n",
    "\n",
    "    #initialize matrix of betas at each step\n",
    "    betaMat = []\n",
    "    betaMat.append(list(beta))\n",
    "\n",
    "    for iStep in range(nSteps):\n",
    "        #calculate residuals\n",
    "        residuals = [0.0] * nrows\n",
    "        for j in range(nrowsTrain):\n",
    "            labelsHat = sum([xTrain[j][k] * beta[k] for k in range(ncols)])\n",
    "            residuals[j] = labelTrain[j] - labelsHat\n",
    "\n",
    "        #calculate correlation between attribute columns from normalized wine and residual\n",
    "        corr = [0.0] * ncols\n",
    "\n",
    "        for j in range(ncols):\n",
    "            corr[j] = sum([xTrain[k][j] * residuals[k] for k in range(nrowsTrain)]) / nrowsTrain\n",
    "\n",
    "        iStar = 0\n",
    "        corrStar = corr[0]\n",
    "\n",
    "        for j in range(1, (ncols)):\n",
    "            if abs(corrStar) < abs(corr[j]):\n",
    "                iStar = j; corrStar = corr[j]\n",
    "\n",
    "        beta[iStar] += stepSize * corrStar / abs(corrStar)\n",
    "        betaMat.append(list(beta))\n",
    "\n",
    "        #Use beta just calculated to predict and accumulate out of sample error - not being used in the calc of beta\n",
    "        for j in range(nrowsTest):\n",
    "            labelsHat = sum([xTest[j][k] * beta[k] for k in range(ncols)])\n",
    "            err = labelTest[j] - labelsHat\n",
    "            errors[iStep].append(err)\n",
    "\n",
    "cvCurve = []\n",
    "for errVect in errors:\n",
    "    mse = sum([x*x for x in errVect])/len(errVect)\n",
    "    cvCurve.append(mse)\n",
    "\n",
    "minMse = min(cvCurve)\n",
    "minPt = [i for i in range(len(cvCurve)) if cvCurve[i] == minMse ][0]\n",
    "print(\"Minimum Mean Square Error\", minMse)\n",
    "print(\"Index of Minimum Mean Square Error\", minPt)\n",
    "\n",
    "xaxis = range(len(cvCurve))\n",
    "plot.plot(xaxis, cvCurve)\n",
    "\n",
    "plot.xlabel(\"Steps Taken\")\n",
    "plot.ylabel((\"Mean Square Error\"))\n",
    "plot.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### wineBasisExpand.py"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fce58eb37b8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "__author__ = 'mike-bowles'\n",
    "\n",
    "import urllib.request, urllib.error, urllib.parse\n",
    "import matplotlib.pyplot as plot\n",
    "from math import sqrt, cos, log\n",
    "\n",
    "#read data into iterable\n",
    "target_url = \"http://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv\"\n",
    "data = urllib.request.urlopen(target_url)\n",
    "\n",
    "xList = []\n",
    "labels = []\n",
    "names = []\n",
    "firstLine = True\n",
    "for line in data:\n",
    "    if firstLine:\n",
    "        names = line.decode().strip().split(\";\")\n",
    "        firstLine = False\n",
    "    else:\n",
    "        #split on semi-colon\n",
    "        row = line.decode().strip().split(\";\")\n",
    "        #put labels in separate array\n",
    "        labels.append(float(row[-1]))\n",
    "        #remove label from row\n",
    "        row.pop()\n",
    "        #convert row to floats\n",
    "        floatRow = [float(num) for num in row]\n",
    "        xList.append(floatRow)\n",
    "\n",
    "\n",
    "#extend the alcohol variable (the last column in that attribute matrix\n",
    "xExtended = []\n",
    "alchCol = len(xList[1])\n",
    "\n",
    "\n",
    "for row in xList:\n",
    "    newRow = list(row)\n",
    "    alch = row[alchCol - 1]\n",
    "    newRow.append((alch - 7) * (alch - 7)/10)\n",
    "    newRow.append(5 * log(alch - 7))\n",
    "    newRow.append(cos(alch))\n",
    "    xExtended.append(newRow)\n",
    "\n",
    "nrow = len(xList)\n",
    "v1 = [xExtended[j][alchCol - 1] for j in range(nrow)]\n",
    "\n",
    "for i in range(4):\n",
    "    v2 = [xExtended[j][alchCol - 1 + i] for j in range(nrow)]\n",
    "    plot.scatter(v1,v2)\n",
    "\n",
    "plot.xlabel(\"Alcohol\")\n",
    "plot.ylabel((\"Extension Functions of Alcohol\"))\n",
    "plot.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
